Skip to content

Commit 7f9d14b

Browse files
committed
V14: Integrations (ActiveCampaign)
- Add new project for Active Campaign - Add new management API for Active Campaign
1 parent 4b3ab84 commit 7f9d14b

30 files changed

+345
-243
lines changed

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/ActiveCampaignComposer.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using Microsoft.Extensions.DependencyInjection;
2-
2+
using Microsoft.OpenApi.Models;
3+
using Swashbuckle.AspNetCore.SwaggerGen;
34
using Umbraco.Cms.Core.Composing;
45
using Umbraco.Cms.Core.DependencyInjection;
5-
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Core.Configuration;
6+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
67

7-
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Core
8+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign
89
{
910
public class ActiveCampaignComposer : IComposer
1011
{
@@ -22,6 +23,19 @@ public void Compose(IUmbracoBuilder builder)
2223
.Add("Api-Token", builder.Config.GetSection(Constants.SettingsPath)[nameof(ActiveCampaignSettings.ApiKey)]);
2324
});
2425

26+
builder.Services.Configure<SwaggerGenOptions>(options =>
27+
{
28+
options.SwaggerDoc(
29+
Constants.ManagementApi.ApiName,
30+
new OpenApiInfo
31+
{
32+
Title = Constants.ManagementApi.ApiTitle,
33+
Version = "Latest",
34+
Description = $"Describes the {Constants.ManagementApi.ApiTitle} available for handling Active Campaign product(s) and configuration."
35+
});
36+
37+
options.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["action"]}");
38+
});
2539
}
2640

2741
}
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
using Umbraco.Cms.Core.PropertyEditors;
1+
//using Umbraco.Cms.Core.PropertyEditors;
22

3-
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Core
4-
{
5-
public class ActiveCampaignFormPickerConfiguration
6-
{
7-
[ConfigurationField("configuration",
8-
name: "Configuration",
9-
view: "~/App_Plugins/UmbracoCms.Integrations/Crm/ActiveCampaign/views/configuration.html",
10-
Description = "API Access")]
11-
public bool IsAccessGranted { get; set; }
12-
}
13-
}
3+
//namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign
4+
//{
5+
// public class ActiveCampaignFormPickerConfiguration
6+
// {
7+
// [ConfigurationField("configuration",
8+
// name: "Configuration",
9+
// view: "~/App_Plugins/UmbracoCms.Integrations/Crm/ActiveCampaign/views/configuration.html",
10+
// Description = "API Access")]
11+
// public bool IsAccessGranted { get; set; }
12+
// }
13+
//}
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
using Umbraco.Cms.Core.IO;
2-
using Umbraco.Cms.Core.PropertyEditors;
3-
using Umbraco.Cms.Core.Services;
1+
//using Umbraco.Cms.Core.IO;
2+
//using Umbraco.Cms.Core.PropertyEditors;
3+
//using Umbraco.Cms.Core.Services;
44

5-
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Core
6-
{
7-
public class ActiveCampaignFormPickerConfigurationEditor : ConfigurationEditor<ActiveCampaignFormPickerConfiguration>
8-
{
9-
public ActiveCampaignFormPickerConfigurationEditor(IIOHelper ioHelper, IEditorConfigurationParser editorConfigurationParser)
10-
: base(ioHelper, editorConfigurationParser)
11-
{
5+
//namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign
6+
//{
7+
// public class ActiveCampaignFormPickerConfigurationEditor : ConfigurationEditor<ActiveCampaignFormPickerConfiguration>
8+
// {
9+
// public ActiveCampaignFormPickerConfigurationEditor(IIOHelper ioHelper, IEditorConfigurationParser editorConfigurationParser)
10+
// : base(ioHelper, editorConfigurationParser)
11+
// {
1212

13-
}
14-
}
15-
}
13+
// }
14+
// }
15+
//}
Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
1-
using Umbraco.Cms.Core.IO;
2-
using Umbraco.Cms.Core.PropertyEditors;
3-
using Umbraco.Cms.Core.Services;
1+
//using Umbraco.Cms.Core.IO;
2+
//using Umbraco.Cms.Core.PropertyEditors;
3+
//using Umbraco.Cms.Core.Services;
44

5-
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Core
6-
{
7-
[DataEditor(
8-
alias: Constants.PropertyEditorAlias,
9-
name: "ActiveCampaign Form Picker",
10-
view: "~/App_Plugins/UmbracoCms.Integrations/Crm/ActiveCampaign/views/formpicker.html",
11-
Group = Cms.Core.Constants.PropertyEditors.Groups.Pickers,
12-
Icon = "icon-activecampaign")]
13-
public class ActiveCampaignFormPickerPropertyEditor : DataEditor
14-
{
15-
private readonly IIOHelper _ioHelper;
5+
//namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign
6+
//{
7+
// [DataEditor(
8+
// alias: Constants.PropertyEditorAlias,
9+
// name: "ActiveCampaign Form Picker",
10+
// view: "~/App_Plugins/UmbracoCms.Integrations/Crm/ActiveCampaign/views/formpicker.html",
11+
// Group = Cms.Core.Constants.PropertyEditors.Groups.Pickers,
12+
// Icon = "icon-activecampaign")]
13+
// public class ActiveCampaignFormPickerPropertyEditor : DataEditor
14+
// {
15+
// private readonly IIOHelper _ioHelper;
1616

17-
private readonly IEditorConfigurationParser _editorConfigurationParser;
17+
// private readonly IEditorConfigurationParser _editorConfigurationParser;
1818

19-
public ActiveCampaignFormPickerPropertyEditor(
20-
IDataValueEditorFactory dataValueEditorFactory,
21-
IIOHelper ioHelper,
22-
IEditorConfigurationParser editorConfigurationParser)
23-
: base(dataValueEditorFactory)
24-
{
25-
_ioHelper = ioHelper;
19+
// public ActiveCampaignFormPickerPropertyEditor(
20+
// IDataValueEditorFactory dataValueEditorFactory,
21+
// IIOHelper ioHelper,
22+
// IEditorConfigurationParser editorConfigurationParser)
23+
// : base(dataValueEditorFactory)
24+
// {
25+
// _ioHelper = ioHelper;
2626

27-
_editorConfigurationParser = editorConfigurationParser;
28-
}
27+
// _editorConfigurationParser = editorConfigurationParser;
28+
// }
2929

30-
protected override IConfigurationEditor CreateConfigurationEditor() =>
31-
new ActiveCampaignFormPickerConfigurationEditor(_ioHelper, _editorConfigurationParser);
32-
}
33-
}
30+
// protected override IConfigurationEditor CreateConfigurationEditor() =>
31+
// new ActiveCampaignFormPickerConfigurationEditor(_ioHelper, _editorConfigurationParser);
32+
// }
33+
//}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using Microsoft.AspNetCore.Authorization;
2+
using Microsoft.AspNetCore.Mvc;
3+
using Microsoft.Extensions.Options;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
using System.Text;
8+
using System.Threading.Tasks;
9+
using Umbraco.Cms.Api.Common.Attributes;
10+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
11+
using Umbraco.Cms.Web.Common.Authorization;
12+
using Umbraco.Cms.Web.Common.Routing;
13+
14+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers
15+
{
16+
[ApiController]
17+
[BackOfficeRoute($"{Constants.ManagementApi.RootPath}/v{{version:apiVersion}}")]
18+
[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)]
19+
[MapToApi(Constants.ManagementApi.ApiName)]
20+
public class ActiveCampaignControllerBase : Controller
21+
{
22+
protected readonly ActiveCampaignSettings Settings;
23+
24+
protected readonly IHttpClientFactory HttpClientFactory;
25+
26+
protected const string ApiPath = "/api/3/forms";
27+
28+
public ActiveCampaignControllerBase(IOptions<ActiveCampaignSettings> options, IHttpClientFactory httpClientFactory)
29+
{
30+
Settings = options.Value;
31+
32+
HttpClientFactory = httpClientFactory;
33+
}
34+
}
35+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Http;
3+
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.Extensions.Options;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Text;
9+
using System.Threading.Tasks;
10+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
11+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Models.Dtos;
12+
13+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers
14+
{
15+
[ApiVersion("1.0")]
16+
[ApiExplorerSettings(GroupName = Constants.ManagementApi.GroupName)]
17+
public class CheckApiAccessController : ActiveCampaignControllerBase
18+
{
19+
public CheckApiAccessController(IOptions<ActiveCampaignSettings> options, IHttpClientFactory httpClientFactory) : base(options, httpClientFactory)
20+
{
21+
}
22+
23+
[HttpGet("api-access")]
24+
[ProducesResponseType(typeof(JsonResult), StatusCodes.Status200OK)]
25+
public IActionResult CheckApiAccess() => new JsonResult(new ApiAccessDto(Settings.BaseUrl, Settings.ApiKey));
26+
}
27+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Http;
3+
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.Extensions.Options;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Net.Http;
9+
using System.Text;
10+
using System.Text.Json;
11+
using System.Text.Json.Nodes;
12+
using System.Threading.Tasks;
13+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
14+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Models.Dtos;
15+
16+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers
17+
{
18+
[ApiVersion("1.0")]
19+
[ApiExplorerSettings(GroupName = Constants.ManagementApi.GroupName)]
20+
public class GetFormsByIdController : ActiveCampaignControllerBase
21+
{
22+
public GetFormsByIdController(IOptions<ActiveCampaignSettings> options, IHttpClientFactory httpClientFactory) : base(options, httpClientFactory)
23+
{
24+
}
25+
26+
[HttpGet("forms/{id}")]
27+
[ProducesResponseType(typeof(Task<IActionResult>), StatusCodes.Status200OK)]
28+
public async Task<IActionResult> GetForm(string id)
29+
{
30+
var client = HttpClientFactory.CreateClient(Constants.FormsHttpClient);
31+
32+
var response = await client.SendAsync(
33+
new HttpRequestMessage
34+
{
35+
Method = HttpMethod.Get,
36+
RequestUri = new Uri($"{client.BaseAddress}{ApiPath}/{id}")
37+
});
38+
39+
var content = await response.Content.ReadAsStringAsync();
40+
41+
if (!response.IsSuccessStatusCode)
42+
{
43+
var result = new JsonResult(new FormResponseDto
44+
{
45+
Message = string.IsNullOrEmpty(content)
46+
? response.StatusCode == System.Net.HttpStatusCode.Forbidden
47+
? Constants.Resources.AuthorizationFailed : Constants.Resources.ApiAccessFailed
48+
: JsonNode.Parse(content)["message"].ToString()
49+
});
50+
51+
return Ok(result);
52+
}
53+
54+
55+
return Ok(new JsonResult(JsonSerializer.Deserialize<FormResponseDto>(content)));
56+
}
57+
}
58+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Http;
3+
using Microsoft.AspNetCore.Mvc;
4+
using Microsoft.Extensions.Options;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Linq;
8+
using System.Net.Http;
9+
using System.Text;
10+
using System.Text.Json;
11+
using System.Text.Json.Nodes;
12+
using System.Threading.Tasks;
13+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
14+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Models.Dtos;
15+
16+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers
17+
{
18+
[ApiVersion("1.0")]
19+
[ApiExplorerSettings(GroupName = Constants.ManagementApi.GroupName)]
20+
public class GetFormsByPageController : ActiveCampaignControllerBase
21+
{
22+
public GetFormsByPageController(IOptions<ActiveCampaignSettings> options, IHttpClientFactory httpClientFactory) : base(options, httpClientFactory)
23+
{
24+
}
25+
26+
[HttpGet("forms/{page:int}")]
27+
[ProducesResponseType(typeof(Task<IActionResult>), StatusCodes.Status200OK)]
28+
public async Task<IActionResult> GetForms(int page = 1)
29+
{
30+
var client = HttpClientFactory.CreateClient(Constants.FormsHttpClient);
31+
32+
var requestUriString = page == 1
33+
? $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}"
34+
: $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}&offset={(page - 1) * Constants.DefaultPageSize}";
35+
36+
var requestMessage = new HttpRequestMessage
37+
{
38+
RequestUri = new Uri(requestUriString),
39+
Method = HttpMethod.Get
40+
};
41+
42+
var response = await client.SendAsync(requestMessage);
43+
44+
var content = await response.Content.ReadAsStringAsync();
45+
46+
if (!response.IsSuccessStatusCode)
47+
{
48+
var result = new JsonResult(new FormCollectionResponseDto
49+
{
50+
Message = string.IsNullOrEmpty(content)
51+
? response.StatusCode == System.Net.HttpStatusCode.Forbidden
52+
? Constants.Resources.AuthorizationFailed : Constants.Resources.ApiAccessFailed
53+
: JsonNode.Parse(content)["message"].ToString()
54+
});
55+
56+
return Ok(result);
57+
}
58+
59+
return Ok(new JsonResult(JsonSerializer.Deserialize<FormCollectionResponseDto>(content)));
60+
}
61+
}
62+
}

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/App_Plugins/UmbracoCms.Integrations/Crm/ActiveCampaign/Render/ActiveCampaignForm.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Core.Models.ViewModels;
1+
@using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Models.ViewModels;
22

33
@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage<FormViewModel>
44

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Configuration/ActiveCampaignSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Core.Configuration
2+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration
33
{
44
public class ActiveCampaignSettings
55
{

0 commit comments

Comments
 (0)