Skip to content

Commit ce63454

Browse files
committed
OAuth configuration update. Save form based on region. Config messages. Form view rendering.
1 parent 119ed07 commit ce63454

File tree

15 files changed

+120
-144
lines changed

15 files changed

+120
-144
lines changed

src/Umbraco.Cms.Integrations.Crm.Hubspot.Tests/Controllers/FormsControllerTests.cs

Lines changed: 15 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void Init()
6969
{
7070
MockedAppSettingsApiSetup = CreateMockedAppSettings(true);
7171

72-
MockedAppSettingsOAuthSetup = CreateMockedAppSettings(includeOAuthSettings: true);
72+
MockedAppSettingsOAuthSetup = CreateMockedAppSettings();
7373

7474
MockedAppSettingsNoSetup = CreateMockedAppSettings();
7575

@@ -81,34 +81,23 @@ public void Init()
8181
[Test]
8282
public void CheckApiConfiguration_WithApiConfig_ShouldReturnValidConfigurationResponseObjectWithType()
8383
{
84-
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), Mock.Of<ILogger>());
85-
84+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<ITokenService>(), Mock.Of<ILogger>());
85+
8686
var result = sut.CheckConfiguration();
8787

8888
Assert.That(result.IsValid, Is.True);
89-
Assert.AreEqual(result.Type, ConfigurationType.Api);
89+
Assert.AreEqual(result.Type.Value, ConfigurationType.Api.Value);
9090
}
9191

9292
[Test]
9393
public void CheckOAuthConfiguration_WithOAuthConfigAndNoApiConfig_ShouldReturnValidConfigurationResponseObjectWithType()
9494
{
95-
var sut = new FormsController(MockedAppSettingsOAuthSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), Mock.Of<ILogger>());
95+
var sut = new FormsController(MockedAppSettingsOAuthSetup.Object, Mock.Of<ITokenService>(), Mock.Of<ILogger>());
9696

9797
var result = sut.CheckConfiguration();
9898

9999
Assert.That(result.IsValid, Is.True);
100-
Assert.AreEqual(result.Type, ConfigurationType.OAuth);
101-
}
102-
103-
[Test]
104-
public void CheckConfiguration_WithoutApiOrOAuthConfig_ShouldReturnInvalidConfigurationResponseObjectWithType()
105-
{
106-
var sut = new FormsController(MockedAppSettingsNoSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), Mock.Of<ILogger>());
107-
108-
var result = sut.CheckConfiguration();
109-
110-
Assert.That(result.IsValid, Is.False);
111-
Assert.AreEqual(result.Type, ConfigurationType.None);
100+
Assert.AreEqual(result.Type.Value, ConfigurationType.OAuth.Value);
112101
}
113102

114103
#endregion
@@ -118,7 +107,7 @@ public void CheckConfiguration_WithoutApiOrOAuthConfig_ShouldReturnInvalidConfig
118107
[Test]
119108
public async Task GetAll_WithoutApiKey_ShouldReturnInvalidResponseObjectWithLoggedInfo()
120109
{
121-
var sut = new FormsController(Mock.Of<IAppSettings>(), Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
110+
var sut = new FormsController(Mock.Of<IAppSettings>(), Mock.Of<ITokenService>(), MockedLogger.Object);
122111

123112
var result = await sut.GetAll();
124113

@@ -131,7 +120,7 @@ public async Task GetAll_WithoutApiKey_ShouldReturnInvalidResponseObjectWithLogg
131120
[Test]
132121
public async Task GetAll_WithUnauthorizedRequest_ShouldReturnExpiredResponseObjectWithLoggedError()
133122
{
134-
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
123+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<ITokenService>(), MockedLogger.Object);
135124

136125
var httpClient = CreateMockedHttpClient(HttpStatusCode.Unauthorized, InvalidApiKey);
137126
FormsController.ClientFactory = () => httpClient;
@@ -147,7 +136,7 @@ public async Task GetAll_WithUnauthorizedRequest_ShouldReturnExpiredResponseObje
147136
[Test]
148137
public async Task GetAll_WithSuccessfulRequest_ShouldReturnResponseObjectWithFormsCollection()
149138
{
150-
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
139+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<ITokenService>(), MockedLogger.Object);
151140

152141
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseApiSetup.json");
153142

@@ -164,7 +153,7 @@ public async Task GetAll_WithSuccessfulRequest_ShouldReturnResponseObjectWithFor
164153
[Test]
165154
public async Task GetAll_WithFailedRequest_ShouldReturnDefaultResponseObjectWithLoggedError()
166155
{
167-
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
156+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<ITokenService>(), MockedLogger.Object);
168157

169158
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseApiSetup.json");
170159

@@ -189,7 +178,7 @@ public async Task GetAllOAuth_WithoutAccessToken_ShouldReturnInvalidResponseObje
189178
{
190179
var mockedTokenService = CreateMockedTokenService(false);
191180

192-
var sut = new FormsController(Mock.Of<IAppSettings>(), Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
181+
var sut = new FormsController(Mock.Of<IAppSettings>(), mockedTokenService.Object, MockedLogger.Object);
193182

194183
var result = await sut.GetAllOAuth();
195184

@@ -204,7 +193,7 @@ public async Task GetAllOAuth_WithUnauthorizedRequest_ShouldReturnExpiredRespons
204193
{
205194
var mockedTokenService = CreateMockedTokenService(true);
206195

207-
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
196+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, mockedTokenService.Object, MockedLogger.Object);
208197

209198
var httpClient = CreateMockedHttpClient(HttpStatusCode.Unauthorized);
210199
FormsController.ClientFactory = () => httpClient;
@@ -222,7 +211,7 @@ public async Task GetAllOAuth_WithSuccessfulRequest_ShouldReturnResponseObjectWi
222211
{
223212
var mockedTokenService = CreateMockedTokenService(true);
224213

225-
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
214+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, mockedTokenService.Object, MockedLogger.Object);
226215

227216
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseOAuthSetup.json");
228217

@@ -241,7 +230,7 @@ public async Task GetAllOAuth_WithFailedRequest_ShouldReturnDefaultResponseObjec
241230
{
242231
var mockedTokenService = CreateMockedTokenService(true);
243232

244-
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
233+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, mockedTokenService.Object, MockedLogger.Object);
245234

246235
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseApiSetup.json");
247236

@@ -259,7 +248,7 @@ public async Task GetAllOAuth_WithFailedRequest_ShouldReturnDefaultResponseObjec
259248

260249
#endregion
261250

262-
private static Mock<IAppSettings> CreateMockedAppSettings(bool includeApiKeySettings = false, bool includeOAuthSettings = false)
251+
private static Mock<IAppSettings> CreateMockedAppSettings(bool includeApiKeySettings = false)
263252
{
264253
var mockedAppSettings = new Mock<IAppSettings>();
265254

@@ -270,22 +259,6 @@ private static Mock<IAppSettings> CreateMockedAppSettings(bool includeApiKeySett
270259
.Returns("test-api-key");
271260
}
272261

273-
if (includeOAuthSettings)
274-
{
275-
mockedAppSettings
276-
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsCrmHubspotOAuthClientId])
277-
.Returns("74d31aa7-337d-40fb-b44b-940e8733eb65");
278-
mockedAppSettings
279-
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsCrmHubspotOAuthScopes])
280-
.Returns("oauth,forms");
281-
mockedAppSettings
282-
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsCrmHubspotOAuthRedirectUrl])
283-
.Returns("https://localhost://oauth/umbraco");
284-
mockedAppSettings
285-
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsOAuthProxyUrl])
286-
.Returns("https://localhost");
287-
}
288-
289262
return mockedAppSettings;
290263
}
291264

src/Umbraco.Cms.Integrations.Crm.Hubspot/App_Plugins/UmbracoCms.Integrations/Crm/Hubspot/Render/HubspotForm.cshtml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
@using System.Configuration
2-
@inherits Umbraco.Web.Mvc.UmbracoViewPage<Umbraco.Cms.Integrations.Crm.Hubspot.Models.ViewModels.HubspotFormViewModel>
1+
@inherits Umbraco.Web.Mvc.UmbracoViewPage<Umbraco.Cms.Integrations.Crm.Hubspot.Models.ViewModels.HubspotFormViewModel>
32

4-
<script charset="utf-8" type="text/javascript" src="https://js-eu1.hsforms.net/forms/shell.js"></script>
3+
@{
4+
var hbsptScriptPath = Model.EuRegion ? "//js-eu1.hsforms.net/forms/shell.js" : "//js.hsforms.net/forms/shell.js";
5+
}
6+
7+
<script charset="utf-8" type="text/javascript" src="@hbsptScriptPath"></script>
58
<script>
69
hbspt.forms.create({
7-
region: "eu1",
10+
region: "@Model.EuRegion ? 'eu1' : 'na1'",
811
portalId: "@Model.PortalId",
912
formId: "@Model.Id"
1013
});

src/Umbraco.Cms.Integrations.Crm.Hubspot/App_Plugins/UmbracoCms.Integrations/Crm/Hubspot/css/styles.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
.hsFormsList {
66
list-style-type: none;
77
margin: 0;
8+
margin-top: 10px;
89
}
910

1011
.hsFormsList a {

src/Umbraco.Cms.Integrations.Crm.Hubspot/App_Plugins/UmbracoCms.Integrations/Crm/Hubspot/js/formpicker.controller.js

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,24 @@
1010
vm.searchTerm = "";
1111
vm.error = "";
1212
vm.isValid = true;
13+
vm.euRegion = false;
14+
15+
const configDescription = {
16+
API: "An API key is configured and will be used to connect to your HubSpot account.",
17+
OAuth:
18+
"No API key is configured. To connect to your HubSpot account using OAuth click 'Connect', select your account and agree to the permissions.",
19+
None: "No API or OAuth configuration could be found. Please review your settings before continuing.",
20+
OAuthConnected:
21+
"OAuth is configured and an access token is available to connect to your HubSpot account. To revoke, click 'Revoke'"
22+
};
1323

1424
// check configuration
1525
checkConfiguration(loadForms);
1626

27+
vm.toggleRegion = function() {
28+
vm.euRegion = !vm.euRegion;
29+
}
30+
1731
vm.remove = function () {
1832
$scope.model.value = null;
1933
};
@@ -28,8 +42,12 @@
2842
subtitle: "Select a form",
2943
view: "/App_Plugins/UmbracoCms.Integrations/Crm/Hubspot/views/formpickereditor.html",
3044
size: "medium",
31-
pickForm: function (form) {
45+
pickForm: function (form, euRegion) {
46+
47+
form.euRegion = euRegion;
48+
3249
vm.saveForm(form);
50+
3351
editorService.close();
3452
},
3553
close: function () {
@@ -46,15 +64,14 @@
4664
vm.status = {
4765
isValid: response.isValid === true,
4866
type: response.type,
49-
description: response.isValid === true ? `${response.type.value} is configured.` : "Invalid configuration",
67+
description: configDescription[response.type.value],
5068
useOAuth: response.isValid === true && response.type.value === oauthName
5169
};
5270

5371
if (response.isValid === false) {
5472
vm.loading = false;
55-
vm.error = "Invalid configuration.";
56-
notificationsService.warning("Hubspot API",
57-
"Invalid setup. Please review the API/OAuth settings.");
73+
vm.error = configDescription.None;
74+
notificationsService.warning("Hubspot API", configDescription.None);
5875
} else {
5976
callback();
6077
}

src/Umbraco.Cms.Integrations.Crm.Hubspot/App_Plugins/UmbracoCms.Integrations/Crm/Hubspot/js/hubspot.resource.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,36 @@
1111
},
1212
getHubspotFormsList: function (id) {
1313
return umbRequestHelper.resourcePromise(
14-
$http.get("backoffice/UmbracoCmsIntegrationsCrmHubspot/Forms/GetAll"), "");
14+
$http.get(`${apiEndpoint}/GetAll`), "");
1515
},
1616
getAuthorizationUrl: function() {
1717
return umbRequestHelper.resourcePromise(
18-
$http.get("backoffice/UmbracoCmsIntegrationsCrmHubspot/Forms/GetAuthorizationUrl"),
18+
$http.get(`${apiEndpoint}/GetAuthorizationUrl`),
1919
"Failed");
2020
},
2121
getAccessToken: function(authorizationCode) {
2222
return umbRequestHelper.resourcePromise(
23-
$http.post("backoffice/UmbracoCmsIntegrationsCrmHubspot/Forms/GetAccessToken", { code: authorizationCode }),
23+
$http.post(`${apiEndpoint}/GetAccessToken`, { code: authorizationCode }),
2424
"Failed");
2525
},
2626
refreshAccessToken: function () {
2727
return umbRequestHelper.resourcePromise(
28-
$http.post("backoffice/UmbracoCmsIntegrationsCrmHubspot/Forms/RefreshAccessToken"),
28+
$http.post(`${apiEndpoint}/RefreshAccessToken`),
29+
"Failed");
30+
},
31+
revokeAccessToken: function () {
32+
return umbRequestHelper.resourcePromise(
33+
$http.post(`${apiEndpoint}/RevokeAccessToken`),
2934
"Failed");
3035
},
3136
validateAccessToken: function () {
3237
return umbRequestHelper.resourcePromise(
33-
$http.get("backoffice/UmbracoCmsIntegrationsCrmHubspot/Forms/ValidateAccessToken"),
38+
$http.get(`${apiEndpoint}/ValidateAccessToken`),
3439
"Failed");
3540
},
3641
getHubspotFormsListOAuth: function () {
3742
return umbRequestHelper.resourcePromise(
38-
$http.get("backoffice/UmbracoCmsIntegrationsCrmHubspot/Forms/GetAllOAuth"),
43+
$http.get(`${apiEndpoint}/GetAllOAuth`),
3944
"Failed");
4045
}
4146
};

src/Umbraco.Cms.Integrations.Crm.Hubspot/App_Plugins/UmbracoCms.Integrations/Crm/Hubspot/js/settings.controller.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,18 @@
33
var vm = this;
44

55
const oauthName = "OAuth";
6+
const configDescription = {
7+
API: "An API key is configured and will be used to connect to your HubSpot account.",
8+
OAuth:
9+
"No API key is configured. To connect to your HubSpot account using OAuth click 'Connect', select your account and agree to the permissions.",
10+
None: "No API or OAuth configuration could be found. Please review your settings before continuing.",
11+
OAuthConnected:
12+
"OAuth is configured and an access token is available to connect to your HubSpot account. To revoke, click 'Revoke'"
13+
};
614

715
vm.oauthSetup = {};
816
vm.status = {};
17+
918

1019
$scope.$on('formSubmitting', function () {
1120

@@ -20,12 +29,12 @@
2029
vm.status = {
2130
isValid: response.isValid === true,
2231
type: response.type,
23-
description: response.isValid === true
24-
? `${response.type.value} is configured.`
25-
: "Invalid configuration",
32+
description: configDescription[response.type.value],
2633
useOAuth: response.isValid === true && response.type.value === oauthName
2734
};
2835

36+
console.log("STATUS: ", vm.status);
37+
2938
if (vm.status.useOAuth) {
3039
validateOAuthSetup();
3140
}
@@ -47,6 +56,12 @@
4756
});
4857
}
4958

59+
vm.onRevokeToken = function() {
60+
umbracoCmsIntegrationsCrmHubspotResource.revokeToken().then(function (response) {
61+
vm.oauthSetup.isConnected = false;
62+
});
63+
}
64+
5065
// authorization listener
5166
window.addEventListener("message", function (event) {
5267
if (event.data.type === "hubspot:oauth:success") {

src/Umbraco.Cms.Integrations.Crm.Hubspot/App_Plugins/UmbracoCms.Integrations/Crm/Hubspot/views/formpickereditor.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010
<input type="text" class="-full-width-input" ng-model="vm.searchTerm" placeholder="Type to search..." umb-auto-focus="" aria-invalid="false">
1111
</div>
1212
</div>
13-
<div class="hsOvumb-eerlayGroup">
13+
<div class="hsOverlayGroup">
14+
<umb-toggle checked="vm.euRegion" show-labels="true" label-on="EU Region" label-off="US Region" on-click="vm.toggleRegion()">
15+
</umb-toggle>
1416
<ul class="hsFormsList">
15-
<li ng-repeat="form in vm.hubspotFormsList | orderBy:'name' | filter:vm.searchTerm" ng-click="model.pickForm(form)" class="ng-scope" role="button" tabindex="0">
17+
<li ng-repeat="form in vm.hubspotFormsList | orderBy:'name' | filter:vm.searchTerm" ng-click="model.pickForm(form, vm.euRegion)" class="ng-scope" role="button" tabindex="0">
1618
<a href="" ng-attr-title="form.name">
1719
<i class="icon-umb-contour"></i>
1820
<span class="formLine">{{form.name}}</span>
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div ng-controller="Umbraco.Cms.Integrations.Crm.Hubspot.SettingsController as vm">
2-
<div ng-class="vm.status.isValid ? 'alert alert-success w5' : 'alert alert-warning w5'">
3-
{{ vm.status.description }}
2+
<div>
3+
<p>{{ vm.status.description }}</p>
44
</div>
55
<div ng-if="vm.status.useOAuth">
66
<umb-button action="vm.onConnectClick()"
@@ -10,5 +10,12 @@
1010
label="Connect"
1111
disabled="vm.oauthSetup.isConnected">
1212
</umb-button>
13+
<umb-button action="vm.onRevokeToken()"
14+
type="button"
15+
button-style="danger"
16+
state="init"
17+
label="Revoke"
18+
disabled="!vm.oauthSetup.isConnected">
19+
</umb-button>
1320
</div>
1421
</div>

src/Umbraco.Cms.Integrations.Crm.Hubspot/Configuration/AppSettingsConstants.cs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,5 @@ namespace Umbraco.Cms.Integrations.Crm.Hubspot.Configuration
44
public static class AppSettingsConstants
55
{
66
public static string UmbracoCmsIntegrationsCrmHubspotApiKey = "Umbraco.Cms.Integrations.Crm.Hubspot.ApiKey";
7-
8-
public static string UmbracoCmsIntegrationsCrmHubspotOAuthClientId = "Umbraco.Cms.Integrations.Crm.Hubspot.OAuthClientId";
9-
10-
public static string UmbracoCmsIntegrationsCrmHubspotOAuthScopes = "Umbraco.Cms.Integrations.Crm.Hubspot.OAuthScopes";
11-
12-
public static string UmbracoCmsIntegrationsCrmHubspotOAuthAuthorizationBaseUrl =
13-
"Umbraco.Cms.Integrations.Crm.Hubspot.OAuthAuthorizationBaseUrl";
14-
15-
public static string UmbracoCmsIntegrationsCrmHubspotOAuthRedirectUrl = "Umbraco.Cms.Integrations.Crm.Hubspot.OAuthRedirectUrl";
16-
17-
public static string UmbracoCmsIntegrationsOAuthProxyUrl = "Umbraco.Cms.Integrations.OAuthProxyUrl";
18-
197
}
208
}

0 commit comments

Comments
 (0)