Skip to content

Commit 5445d8e

Browse files
committed
V14: Integrations (ActiveCampaign/Forms)
- Implement management api for Active Campaign
1 parent 3ef4503 commit 5445d8e

File tree

12 files changed

+173
-72
lines changed

12 files changed

+173
-72
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
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;
56
using Umbraco.Forms.Core.Providers;
@@ -30,6 +31,21 @@ public void Compose(IUmbracoBuilder builder)
3031

3132
builder.Services.AddSingleton<IAccountService, AccountService>();
3233
builder.Services.AddSingleton<IContactService, ContactService>();
34+
35+
// Generate Swagger documentation for Zapier API
36+
builder.Services.Configure<SwaggerGenOptions>(options =>
37+
{
38+
options.SwaggerDoc(
39+
Constants.ManagementApi.ApiName,
40+
new OpenApiInfo
41+
{
42+
Title = Constants.ManagementApi.ApiTitle,
43+
Version = "Latest",
44+
Description = $"Describes the {Constants.ManagementApi.ApiTitle} available for handling Active Campaign automation and configuration."
45+
});
46+
47+
options.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["action"]}");
48+
});
3349
}
3450
}
3551
}

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/ActiveCampaignContactsWorkflow.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Microsoft.Extensions.Options;
33

44
using System.Text.Json;
5-
65
using Umbraco.Forms.Core;
76
using Umbraco.Forms.Core.Enums;
87
using Umbraco.Forms.Core.Persistence.Dtos;
@@ -55,7 +54,7 @@ public ActiveCampaignContactsWorkflow(IOptions<ActiveCampaignSettings> options,
5554
_logger = logger;
5655
}
5756

58-
public override WorkflowExecutionStatus Execute(WorkflowExecutionContext context)
57+
public override async Task<WorkflowExecutionStatus> ExecuteAsync(WorkflowExecutionContext context)
5958
{
6059
try
6160
{
@@ -71,7 +70,7 @@ public override WorkflowExecutionStatus Execute(WorkflowExecutionContext context
7170
{
7271
_logger.LogInformation("Contact already exists in ActiveCampaign and workflow is configured to not apply updates, so update of information was skipped.");
7372

74-
return WorkflowExecutionStatus.Completed;
73+
return await Task.FromResult<WorkflowExecutionStatus>(WorkflowExecutionStatus.Completed);
7574
}
7675

7776
var requestDto = new ContactDetailDto { Contact = Build(context.Record) };
@@ -97,7 +96,7 @@ public override WorkflowExecutionStatus Execute(WorkflowExecutionContext context
9796
{
9897
_logger.LogError($"Failed to create/update contact: {email}");
9998

100-
return WorkflowExecutionStatus.Failed;
99+
return await Task.FromResult<WorkflowExecutionStatus>(WorkflowExecutionStatus.Failed);
101100
}
102101

103102
// Associate contact with account if last one is specified.
@@ -107,13 +106,13 @@ public override WorkflowExecutionStatus Execute(WorkflowExecutionContext context
107106
.ConfigureAwait(false).GetAwaiter().GetResult();
108107
}
109108

110-
return WorkflowExecutionStatus.Completed;
109+
return await Task.FromResult<WorkflowExecutionStatus>(WorkflowExecutionStatus.Completed);
111110
}
112111
catch(Exception ex)
113112
{
114113
_logger.LogError(ex, ex.Message);
115114

116-
return WorkflowExecutionStatus.Failed;
115+
return await Task.FromResult<WorkflowExecutionStatus>(WorkflowExecutionStatus.Failed);
117116
}
118117
}
119118

Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
1-
using System;
1+
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Mvc;
3+
using System;
24
using System.Collections.Generic;
35
using System.Linq;
46
using System.Text;
57
using System.Threading.Tasks;
8+
using Umbraco.Cms.Web.Common.Routing;
9+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Services;
610

711
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Accounts
812
{
13+
[ApiVersion("1.0")]
14+
[BackOfficeRoute($"{Constants.ManagementApi.RootPath}/v{{version:apiVersion}}/accounts")]
15+
[ApiExplorerSettings(GroupName = Constants.ManagementApi.AccountsGroupName)]
916
public class AccountControllerBase : ActiveCampaingControllerBase
1017
{
18+
protected readonly IAccountService _accountService;
19+
20+
public AccountControllerBase(IAccountService accountService)
21+
{
22+
_accountService = accountService;
23+
}
1124
}
1225
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Microsoft.AspNetCore.Http;
2+
using Microsoft.AspNetCore.Mvc;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Models.Dtos;
9+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Services;
10+
11+
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Accounts
12+
{
13+
public class GetAccountController : AccountControllerBase
14+
{
15+
public GetAccountController(IAccountService accountService) : base(accountService)
16+
{
17+
}
18+
19+
[HttpGet]
20+
[ProducesResponseType(typeof(AccountCollectionResponseDto), StatusCodes.Status200OK)]
21+
public async Task<IActionResult> GetAccounts()
22+
{
23+
var accounts = await _accountService.Get();
24+
25+
return Ok(new JsonResult(accounts));
26+
}
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.AspNetCore.Http;
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.Forms.Integrations.Crm.ActiveCampaign.Configuration;
10+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Models.Dtos;
11+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Services;
12+
13+
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Contacts
14+
{
15+
public class CheckApiAccessController : ContactControllerBase
16+
{
17+
public CheckApiAccessController(IOptions<ActiveCampaignSettings> options, IContactService contactService) : base(options, contactService)
18+
{
19+
}
20+
21+
[HttpGet("api-access")]
22+
[ProducesResponseType(typeof(ApiAccessDto), StatusCodes.Status200OK)]
23+
public IActionResult CheckApiAccess() => Ok(new JsonResult(new ApiAccessDto(_settings.BaseUrl, _settings.ApiKey)));
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,31 @@
1-
using System;
1+
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Mvc;
3+
using Microsoft.Extensions.Options;
4+
using System;
25
using System.Collections.Generic;
36
using System.Linq;
47
using System.Text;
58
using System.Threading.Tasks;
9+
using Umbraco.Cms.Web.Common.Routing;
10+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Configuration;
11+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Services;
612

713
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Contacts
814
{
15+
[ApiVersion("1.0")]
16+
[BackOfficeRoute($"{Constants.ManagementApi.RootPath}/v{{version:apiVersion}}/contacts")]
17+
[ApiExplorerSettings(GroupName = Constants.ManagementApi.ContactGroupName)]
918
public class ContactControllerBase : ActiveCampaingControllerBase
1019
{
20+
protected readonly ActiveCampaignSettings _settings;
21+
22+
protected readonly IContactService _contactService;
23+
24+
public ContactControllerBase(IOptions<ActiveCampaignSettings> options, IContactService contactService)
25+
{
26+
_settings = options.Value;
27+
28+
_contactService = contactService;
29+
}
1130
}
1231
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.AspNetCore.Http;
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.Forms.Integrations.Crm.ActiveCampaign.Configuration;
10+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Models.Dtos;
11+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Services;
12+
13+
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Contacts
14+
{
15+
public class GetContactFieldsController : ContactControllerBase
16+
{
17+
public GetContactFieldsController(IOptions<ActiveCampaignSettings> options, IContactService contactService) : base(options, contactService)
18+
{
19+
}
20+
21+
[HttpGet("fields")]
22+
[ProducesResponseType(typeof(List<ContactFieldSettings>), StatusCodes.Status200OK)]
23+
public IActionResult GetContactFields() => Ok(new JsonResult(_settings.ContactFields));
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Microsoft.AspNetCore.Http;
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.Forms.Integrations.Crm.ActiveCampaign.Configuration;
10+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Models.Dtos;
11+
using Umbraco.Forms.Integrations.Crm.ActiveCampaign.Services;
12+
13+
namespace Umbraco.Forms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers.Contacts
14+
{
15+
public class GetCustomFieldsController : ContactControllerBase
16+
{
17+
public GetCustomFieldsController(IOptions<ActiveCampaignSettings> options, IContactService contactService) : base(options, contactService)
18+
{
19+
}
20+
21+
[HttpGet("custom")]
22+
[ProducesResponseType(typeof(CustomFieldCollectionResponseDto), StatusCodes.Status200OK)]
23+
public IActionResult GetCustomFields() =>
24+
Ok(new JsonResult(_contactService.GetCustomFields().ConfigureAwait(false).GetAwaiter().GetResult()));
25+
}
26+
}

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/Constants.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,17 @@ public class Constants
88
public const string SettingsPath = "Umbraco:Forms:Integrations:Crm:ActiveCampaign:Settings";
99

1010
public const string HttpClient = "ActiveCampaignClient";
11+
12+
public static class ManagementApi
13+
{
14+
public const string RootPath = "active-campaign/management/api";
15+
16+
public const string ApiName = "active-campaign-management";
17+
18+
public const string ApiTitle = "Active Campaign Management API";
19+
20+
public const string ContactGroupName = "Contacts";
21+
public const string AccountsGroupName = "Accounts";
22+
}
1123
}
1224
}

src/Umbraco.Forms.Integrations.Crm.ActiveCampaign/Controllers/AccountsController.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)