Skip to content

Commit bc9067f

Browse files
Cache relations
1 parent c3ccd1e commit bc9067f

File tree

5 files changed

+72
-53
lines changed

5 files changed

+72
-53
lines changed

src/Umbraco.Commerce.Checkout/Events/SetStoreCheckoutRelation.cs

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Umbraco.Cms.Core.Services;
66
using Umbraco.Cms.Core.Services.Navigation;
77
using Umbraco.Cms.Core.Sync;
8+
using Umbraco.Commerce.Checkout.Helpers;
89
using UmbracoCommerceConstants = Umbraco.Commerce.Cms.Constants;
910

1011
namespace Umbraco.Commerce.Checkout.Events;
@@ -14,7 +15,7 @@ public class SetStoreCheckoutRelation(
1415
IContentService contentService,
1516
IIdKeyMap keyMap,
1617
IServerRoleAccessor serverRoleAccessor,
17-
IRelationService relationService)
18+
StoreCheckoutRelationHelper relationHelper)
1819
: ContentOfTypeCacheRefresherNotificationHandlerBase(documentNavigationQueryService, contentService, keyMap, serverRoleAccessor)
1920
{
2021
private readonly IDocumentNavigationQueryService _documentNavigationQueryService = documentNavigationQueryService;
@@ -26,7 +27,7 @@ protected override Task HandleContentOfTypeAsync(IContent content)
2627
{
2728
if (content.HasProperty(UmbracoCommerceConstants.Properties.StorePropertyAlias))
2829
{
29-
EnsureStoreCheckoutRelation(content, content);
30+
relationHelper.EnsureStoreCheckoutRelation(content.Id, content.Id);
3031
}
3132
else
3233
{
@@ -39,7 +40,7 @@ protected override Task HandleContentOfTypeAsync(IContent content)
3940
{
4041
if (content2.HasProperty(UmbracoCommerceConstants.Properties.StorePropertyAlias))
4142
{
42-
EnsureStoreCheckoutRelation(content2, content);
43+
relationHelper.EnsureStoreCheckoutRelation(content2.Id, content.Id);
4344
break;
4445
}
4546
}
@@ -49,27 +50,4 @@ protected override Task HandleContentOfTypeAsync(IContent content)
4950

5051
return Task.CompletedTask;
5152
}
52-
53-
private void EnsureStoreCheckoutRelation(IContent storeRootPage, IContent checkoutPage)
54-
{
55-
if (!relationService.AreRelated(storeRootPage.Id, checkoutPage.Id, UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout))
56-
{
57-
IRelationType? relationType = relationService.GetRelationTypeByAlias(UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout);
58-
59-
if (relationType == null)
60-
{
61-
relationType = new RelationType(
62-
"[Umbraco Commerce Checkout] Store Checkout",
63-
UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout,
64-
true,
65-
Umbraco.Cms.Core.Constants.ObjectTypes.Document,
66-
Umbraco.Cms.Core.Constants.ObjectTypes.Document,
67-
false);
68-
69-
relationService.Save(relationType);
70-
}
71-
72-
relationService.Save(new Relation(storeRootPage.Id, checkoutPage.Id, relationType));
73-
}
74-
}
7553
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Umbraco.Cms.Core.Models;
5+
using Umbraco.Cms.Core.Models.PublishedContent;
6+
using Umbraco.Cms.Core.PublishedCache;
7+
using Umbraco.Cms.Core.Services;
8+
using Umbraco.Commerce.Checkout.Web;
9+
using Umbraco.Commerce.Core.Cache;
10+
11+
namespace Umbraco.Commerce.Checkout.Helpers;
12+
13+
public class StoreCheckoutRelationHelper(IRelationService relationService, IPublishedContentCache contentCache, ICacheAccessor cache)
14+
{
15+
private static string CACHE_KEY = "uc:store-checkout-relations";
16+
17+
public void EnsureStoreCheckoutRelation(int storeRootPageId, int checkoutPageId)
18+
{
19+
if (!relationService.AreRelated(storeRootPageId, checkoutPageId, UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout))
20+
{
21+
IRelationType? relationType = relationService.GetRelationTypeByAlias(UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout);
22+
23+
if (relationType == null)
24+
{
25+
relationType = new RelationType(
26+
"[Umbraco Commerce Checkout] Store Checkout",
27+
UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout,
28+
true,
29+
Umbraco.Cms.Core.Constants.ObjectTypes.Document,
30+
Umbraco.Cms.Core.Constants.ObjectTypes.Document,
31+
false);
32+
33+
relationService.Save(relationType);
34+
}
35+
36+
relationService.Save(new Relation(storeRootPageId, checkoutPageId, relationType));
37+
38+
ClearCache();
39+
}
40+
}
41+
42+
public IPublishedContent? ResolveCheckoutPageByStoreId(Guid storeId)
43+
{
44+
IEnumerable<IRelation>? relations = cache.RuntimeCache.GetTyped(CACHE_KEY,
45+
() => relationService.GetByRelationTypeAlias(UmbracoCommerceCheckoutConstants.RelationTypes.Aliases
46+
.StoreCheckout));
47+
48+
IRelation? storeCheckoutRelation = cache.RuntimeCache.GetTyped($"{CACHE_KEY}:{storeId}",
49+
() => relations.FirstOrDefault(x => contentCache.GetById(x.ParentId)?.GetStore().Id == storeId));
50+
51+
return storeCheckoutRelation != null ? contentCache.GetById(storeCheckoutRelation.ChildId) : null;
52+
}
53+
54+
public void ClearCache()
55+
{
56+
cache.RuntimeCache.Clear(CACHE_KEY);
57+
cache.RuntimeCache.ClearByKey(CACHE_KEY);
58+
}
59+
}

src/Umbraco.Commerce.Checkout/Views/UmbracoCommerceCheckout/Templates/Email/UmbracoCommerceCheckoutGiftCardEmail.cshtml

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
1-
@using Umbraco.Cms.Core.Services
1+
@using Umbraco.Commerce.Checkout.Helpers
22
@inherits UmbracoCommerceRazorTemplateView<GiftCardReadOnly>
33
@{
44
// Get order entities
55
var store = await UmbracoCommerceApi.GetStoreAsync(Model.StoreId);
66

77
// Lookup the umbraco commerce checkout page for the associated orders store
88
// so that we can extract relevant settings to configure the email template
9-
var contentCache = this.GetRequiredService<IPublishedContentCache>();
10-
var relationService = this.GetRequiredService<IRelationService>();
11-
var storeCheckoutRelations = relationService.GetByRelationTypeAlias(UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout);
12-
var storeCheckoutRelation = storeCheckoutRelations.FirstOrDefault(x => contentCache.GetById(x.ParentId)?.GetStore().Id == store.Id);
13-
var checkoutPage = storeCheckoutRelation != null ? contentCache.GetById(storeCheckoutRelation.ChildId) : null;
14-
9+
var checkoutRelationHelper = this.GetRequiredService<StoreCheckoutRelationHelper>();
10+
var checkoutPage = checkoutRelationHelper.ResolveCheckoutPageByStoreId(store.Id);
1511
if (checkoutPage == null)
1612
{
1713
throw new InvalidOperationException($"No checkout page found for store {store.Name} ({store.Id})");

src/Umbraco.Commerce.Checkout/Views/UmbracoCommerceCheckout/Templates/Email/UmbracoCommerceCheckoutOrderConfirmationEmail.cshtml

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@using Umbraco.Cms.Core.Services
1+
@using Umbraco.Commerce.Checkout.Helpers
22
@inherits UmbracoCommerceRazorTemplateView<OrderReadOnly>
33
@{
44
// Get order entities
@@ -24,12 +24,8 @@
2424

2525
// Lookup the umbraco commerce checkout page for the associated orders store
2626
// so that we can extract relevant settings to configure the email template
27-
var contentCache = this.GetRequiredService<IPublishedContentCache>();
28-
var relationService = this.GetRequiredService<IRelationService>();
29-
var storeCheckoutRelations = relationService.GetByRelationTypeAlias(UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout);
30-
var storeCheckoutRelation = storeCheckoutRelations.FirstOrDefault(x => contentCache.GetById(x.ParentId)?.GetStore().Id == store.Id);
31-
var checkoutPage = storeCheckoutRelation != null ? contentCache.GetById(storeCheckoutRelation.ChildId) : null;
32-
27+
var checkoutRelationHelper = this.GetRequiredService<StoreCheckoutRelationHelper>();
28+
var checkoutPage = checkoutRelationHelper.ResolveCheckoutPageByStoreId(store.Id);
3329
if (checkoutPage == null)
3430
{
3531
throw new InvalidOperationException($"No checkout page found for store {store.Name} ({store.Id})");

src/Umbraco.Commerce.Checkout/Views/UmbracoCommerceCheckout/Templates/Email/UmbracoCommerceCheckoutOrderErrorEmail.cshtml

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,13 @@
1-
@using Umbraco.Cms.Core.Services
1+
@using Umbraco.Commerce.Checkout.Helpers
22
@inherits UmbracoCommerceRazorTemplateView<OrderReadOnly>
33
@{
44
// Get order entities
55
var store = await UmbracoCommerceApi.GetStoreAsync(Model.StoreId);
66

77
// Lookup the umbraco commerce checkout page for the associated orders store
88
// so that we can extract relevant settings to configure the email template
9-
// var contentCache = this.GetRequiredService<IPublishedContentCache>();
10-
// var nav = this.GetRequiredService<IDocumentNavigationQueryService>();
11-
// var rootKeys = nav.TryGetRootKeys(out var keys1) ? keys1 : [];
12-
// var nodeKeys = rootKeys.SelectMany(key => nav.TryGetDescendantsKeysOfType(key, UmbracoCommerceCheckoutConstants.ContentTypes.Aliases.CheckoutPage, out var keys2) ? keys2 : []);
13-
// var checkoutPage = nodeKeys.Select(x => contentCache.GetById(x)).FirstOrDefault(x => x.GetStore()?.Id == Model.StoreId);
14-
15-
var contentCache = this.GetRequiredService<IPublishedContentCache>();
16-
var relationService = this.GetRequiredService<IRelationService>();
17-
var storeCheckoutRelations = relationService.GetByRelationTypeAlias(UmbracoCommerceCheckoutConstants.RelationTypes.Aliases.StoreCheckout);
18-
var storeCheckoutRelation = storeCheckoutRelations.FirstOrDefault(x => contentCache.GetById(x.ParentId)?.GetStore().Id == store.Id);
19-
var checkoutPage = storeCheckoutRelation != null ? contentCache.GetById(storeCheckoutRelation.ChildId) : null;
20-
9+
var checkoutRelationHelper = this.GetRequiredService<StoreCheckoutRelationHelper>();
10+
var checkoutPage = checkoutRelationHelper.ResolveCheckoutPageByStoreId(store.Id);
2111
if (checkoutPage == null)
2212
{
2313
throw new InvalidOperationException($"No checkout page found for store {store.Name} ({store.Id})");

0 commit comments

Comments
 (0)