Skip to content

Commit a549971

Browse files
committed
Adding fix for self-referncing redirects for 17
1 parent f11b8ff commit a549971

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

src/Umbraco.Core/Services/RedirectUrlService.cs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,62 @@
1-
using System.Threading.Tasks;
1+
using Microsoft.Extensions.DependencyInjection;
22
using Microsoft.Extensions.Logging;
3+
using Umbraco.Cms.Core.DependencyInjection;
34
using Umbraco.Cms.Core.Events;
45
using Umbraco.Cms.Core.Models;
6+
using Umbraco.Cms.Core.Models.PublishedContent;
57
using Umbraco.Cms.Core.Persistence.Repositories;
8+
using Umbraco.Cms.Core.Routing;
69
using Umbraco.Cms.Core.Scoping;
710

811
namespace Umbraco.Cms.Core.Services;
912

1013
internal sealed class RedirectUrlService : RepositoryService, IRedirectUrlService
1114
{
1215
private readonly IRedirectUrlRepository _redirectUrlRepository;
16+
private readonly IPublishedUrlProvider _publishedUrlProvider;
1317

1418
public RedirectUrlService(
1519
ICoreScopeProvider provider,
1620
ILoggerFactory loggerFactory,
1721
IEventMessagesFactory eventMessagesFactory,
18-
IRedirectUrlRepository redirectUrlRepository)
19-
: base(provider, loggerFactory, eventMessagesFactory) =>
22+
IRedirectUrlRepository redirectUrlRepository,
23+
IPublishedUrlProvider publishedUrlProvider)
24+
: base(provider, loggerFactory, eventMessagesFactory)
25+
{
2026
_redirectUrlRepository = redirectUrlRepository;
27+
_publishedUrlProvider = publishedUrlProvider;
28+
}
29+
30+
[Obsolete("Use the constructor taking all parameters. Scheduled for removal in Umbraco 19")]
31+
public RedirectUrlService(
32+
ICoreScopeProvider provider,
33+
ILoggerFactory loggerFactory,
34+
IEventMessagesFactory eventMessagesFactory,
35+
IRedirectUrlRepository redirectUrlRepository)
36+
: this(provider,
37+
loggerFactory,
38+
eventMessagesFactory,
39+
StaticServiceProvider.Instance.GetRequiredService<IRedirectUrlRepository>(),
40+
StaticServiceProvider.Instance.GetRequiredService<IPublishedUrlProvider>())
41+
{
42+
}
2143

2244
public void Register(string url, Guid contentKey, string? culture = null)
2345
{
2446
using (ICoreScope scope = ScopeProvider.CreateCoreScope())
2547
{
48+
var newUrl = _publishedUrlProvider.GetUrl(contentKey, UrlMode.Relative, culture).TrimEnd('/');
49+
IEnumerable<IRedirectUrl> allRedirectUrls = _redirectUrlRepository.GetContentUrls(contentKey);
50+
51+
// If there's a redirect URL that points to the new URL, delete it.
52+
foreach (IRedirectUrl redirectUrl in allRedirectUrls)
53+
{
54+
if (redirectUrl.Url == newUrl)
55+
{
56+
_redirectUrlRepository.Delete(redirectUrl.Key);
57+
}
58+
}
59+
2660
IRedirectUrl? redir = _redirectUrlRepository.Get(url, contentKey, culture);
2761
if (redir != null)
2862
{

0 commit comments

Comments
 (0)