Skip to content

Commit f302451

Browse files
authored
Merge pull request #261 from umbraco/v16/activecampaign
V16/activecampaign
2 parents 7767d77 + 35084a8 commit f302451

26 files changed

+2336
-1962
lines changed

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using Microsoft.Extensions.DependencyInjection;
22
using Microsoft.OpenApi.Models;
33
using Swashbuckle.AspNetCore.SwaggerGen;
4+
using Umbraco.Cms.Api.Common.OpenApi;
45
using Umbraco.Cms.Core.Composing;
56
using Umbraco.Cms.Core.DependencyInjection;
7+
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Configuration;
68
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
79

810
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign
@@ -34,8 +36,9 @@ public void Compose(IUmbracoBuilder builder)
3436
Description = $"Describes the {Constants.ManagementApi.ApiTitle} available for handling Active Campaign product(s) and configuration."
3537
});
3638

37-
options.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["action"]}");
38-
});
39+
options.OperationFilter<BackOfficeSecurityRequirementsOperationFilter>();
40+
})
41+
.AddSingleton<IOperationIdHandler, ActiveCampaignOperationIdHandler>();
3942
}
4043

4144
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Asp.Versioning;
2+
using Microsoft.AspNetCore.Mvc.ApiExplorer;
3+
using Microsoft.AspNetCore.Mvc.Controllers;
4+
using Microsoft.Extensions.Options;
5+
using Umbraco.Cms.Api.Common.OpenApi;
6+
7+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Configuration
8+
{
9+
internal class ActiveCampaignOperationIdHandler : OperationIdHandler
10+
{
11+
public ActiveCampaignOperationIdHandler(IOptions<ApiVersioningOptions> apiVersioningOptions) : base(apiVersioningOptions)
12+
{
13+
}
14+
15+
protected override bool CanHandle(ApiDescription apiDescription, ControllerActionDescriptor controllerActionDescriptor)
16+
=> controllerActionDescriptor.ControllerTypeInfo.Namespace?.StartsWith("Umbraco.Cms.Integrations.Crm.ActiveCampaign") is true;
17+
}
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Umbraco.Cms.Api.Management.OpenApi;
2+
3+
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Configuration
4+
{
5+
internal class BackOfficeSecurityRequirementsOperationFilter : BackOfficeSecurityRequirementsOperationFilterBase
6+
{
7+
protected override string ApiName => Constants.ManagementApi.ApiName;
8+
}
9+
}

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Api/Management/Controllers/ActiveCampaignControllerBase.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
using System.Text.Json;
66
using System.Text.Json.Nodes;
77
using Umbraco.Cms.Api.Common.Attributes;
8+
using Umbraco.Cms.Api.Common.Builders;
89
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
9-
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Models.Dtos;
1010
using Umbraco.Cms.Web.Common.Authorization;
1111
using Umbraco.Cms.Web.Common.Routing;
1212

1313
namespace Umbraco.Cms.Integrations.Crm.ActiveCampaign.Api.Management.Controllers
1414
{
1515
[ApiController]
1616
[BackOfficeRoute($"{Constants.ManagementApi.RootPath}/v{{version:apiVersion}}")]
17-
//[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)]
17+
[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)]
1818
[MapToApi(Constants.ManagementApi.ApiName)]
1919
public class ActiveCampaignControllerBase : Controller
2020
{
@@ -55,7 +55,9 @@ protected async Task<IActionResult> HandleResponseAsync<T>(HttpResponseMessage?
5555
? Constants.Resources.ApiAccessFailed
5656
: responseMessage;
5757

58-
return StatusCode((int)httpResponse.StatusCode, message);
58+
return StatusCode((int)httpResponse.StatusCode, new ProblemDetailsBuilder()
59+
.WithTitle(message)
60+
.Build());
5961
}
6062
}
6163
}

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Api/Management/Controllers/GetFormByIdController.cs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.AspNetCore.Http;
33
using Microsoft.AspNetCore.Mvc;
44
using Microsoft.Extensions.Options;
5+
using Umbraco.Cms.Api.Common.Builders;
56
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
67
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Models.Dtos;
78

@@ -22,16 +23,25 @@ public GetFormByIdController(IOptions<ActiveCampaignSettings> options, IHttpClie
2223
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
2324
public async Task<IActionResult> GetForm(string id)
2425
{
25-
var client = HttpClientFactory.CreateClient(Constants.FormsHttpClient);
26+
try
27+
{
28+
var client = HttpClientFactory.CreateClient(Constants.FormsHttpClient);
2629

27-
var response = await client.SendAsync(
28-
new HttpRequestMessage
29-
{
30-
Method = HttpMethod.Get,
31-
RequestUri = new Uri($"{client.BaseAddress}{ApiPath}/{id}")
32-
});
30+
var response = await client.SendAsync(
31+
new HttpRequestMessage
32+
{
33+
Method = HttpMethod.Get,
34+
RequestUri = new Uri($"{client.BaseAddress}{ApiPath}/{id}")
35+
});
3336

34-
return await HandleResponseAsync<FormResponseDto>(response);
37+
return await HandleResponseAsync<FormResponseDto>(response);
38+
}
39+
catch (Exception ex)
40+
{
41+
return StatusCode(StatusCodes.Status500InternalServerError, new ProblemDetailsBuilder()
42+
.WithTitle(ex.Message)
43+
.Build());
44+
}
3545
}
3646
}
3747
}

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Api/Management/Controllers/GetFormsPagedController.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.AspNetCore.Http;
33
using Microsoft.AspNetCore.Mvc;
44
using Microsoft.Extensions.Options;
5+
using Umbraco.Cms.Api.Common.Builders;
56
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Configuration;
67
using Umbraco.Cms.Integrations.Crm.ActiveCampaign.Models.Dtos;
78

@@ -20,23 +21,32 @@ public GetFormsByPageController(IOptions<ActiveCampaignSettings> options, IHttpC
2021
[ProducesResponseType(StatusCodes.Status404NotFound)]
2122
[ProducesResponseType(StatusCodes.Status403Forbidden)]
2223
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
23-
public async Task<IActionResult> GetForms([FromQuery]int? page = 1)
24+
public async Task<IActionResult> GetForms([FromQuery] int? page = 1)
2425
{
25-
var client = HttpClientFactory.CreateClient(Constants.FormsHttpClient);
26+
try
27+
{
28+
var client = HttpClientFactory.CreateClient(Constants.FormsHttpClient);
2629

27-
var requestUriString = page == 1
28-
? $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}"
29-
: $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}&offset={(page - 1) * Constants.DefaultPageSize}";
30+
var requestUriString = page == 1
31+
? $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}"
32+
: $"{client.BaseAddress}{ApiPath}&limit={Constants.DefaultPageSize}&offset={(page - 1) * Constants.DefaultPageSize}";
3033

31-
var requestMessage = new HttpRequestMessage
32-
{
33-
RequestUri = new Uri(requestUriString),
34-
Method = HttpMethod.Get
35-
};
34+
var requestMessage = new HttpRequestMessage
35+
{
36+
RequestUri = new Uri(requestUriString),
37+
Method = HttpMethod.Get
38+
};
3639

37-
var response = await client.SendAsync(requestMessage);
40+
var response = await client.SendAsync(requestMessage);
3841

39-
return await HandleResponseAsync<FormCollectionResponseDto>(response);
42+
return await HandleResponseAsync<FormCollectionResponseDto>(response);
43+
}
44+
catch (Exception ex)
45+
{
46+
return StatusCode(StatusCodes.Status500InternalServerError, new ProblemDetailsBuilder()
47+
.WithTitle(ex.Message)
48+
.Build());
49+
}
4050
}
4151
}
4252
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// This file is auto-generated by @hey-api/openapi-ts
2+
3+
import type { ClientOptions } from './types.gen';
4+
import { type Config, type ClientOptions as DefaultClientOptions, createClient, createConfig } from '@hey-api/client-fetch';
5+
6+
/**
7+
* The `createClientConfig()` function will be called on client initialization
8+
* and the returned object will become the client's initial configuration.
9+
*
10+
* You may want to initialize your client this way instead of calling
11+
* `setConfig()`. This is useful for example if you're using Next.js
12+
* to ensure your client always has the correct values.
13+
*/
14+
export type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> = (override?: Config<DefaultClientOptions & T>) => Config<Required<DefaultClientOptions> & T>;
15+
16+
export const client = createClient(createConfig<ClientOptions>({
17+
baseUrl: 'http://localhost:30450',
18+
throwOnError: true
19+
}));

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/generated/core/ApiError.ts

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

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/generated/core/ApiRequestOptions.ts

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

src/Umbraco.Cms.Integrations.Crm.ActiveCampaign/Client/generated/core/ApiResult.ts

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

0 commit comments

Comments
 (0)