1414
1515namespace VirtoCommerce . Xapi . Data . Queries ;
1616
17- public class SlugInfoQueryHandler : IQueryHandler < SlugInfoQuery , SlugInfoResponse >
17+ public class SlugInfoQueryHandler (
18+ ICompositeSeoResolver seoResolver ,
19+ IStoreService storeService ,
20+ IBrokenLinkSearchService brokenLinkSearchService )
21+ : IQueryHandler < SlugInfoQuery , SlugInfoResponse >
1822{
19- private readonly ICompositeSeoResolver _seoResolver ;
20- private readonly IStoreService _storeService ;
21-
22- public SlugInfoQueryHandler ( ICompositeSeoResolver seoResolver , IStoreService storeService )
23- {
24- _seoResolver = seoResolver ;
25- _storeService = storeService ;
26- }
2723
2824 public async Task < SlugInfoResponse > Handle ( SlugInfoQuery request , CancellationToken cancellationToken )
2925 {
@@ -34,7 +30,7 @@ public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationTo
3430 return result ;
3531 }
3632
37- var store = await _storeService . GetByIdAsync ( request . StoreId ) ;
33+ var store = await storeService . GetByIdAsync ( request . StoreId ) ;
3834 if ( store is null )
3935 {
4036 return result ;
@@ -54,18 +50,34 @@ public async Task<SlugInfoResponse> Handle(SlugInfoQuery request, CancellationTo
5450
5551 result . EntityInfo = await GetBestMatchingSeoInfo ( criteria , store ) ;
5652
57- //if (result.EntityInfo == null)
58- //{
59- // // todo: use seofaultservice
60- // result.RedirectUrl = "";
61- //}
53+ if ( result . EntityInfo == null )
54+ {
55+ var brokenLinkCriteria = AbstractTypeFactory < BrokenLinkSearchCriteria > . TryCreateInstance ( ) ;
56+
57+ brokenLinkCriteria . Permalink = request . Permalink ;
58+ brokenLinkCriteria . StoreId = store . Id ;
59+ brokenLinkCriteria . Status = Seo . Core . ModuleConstants . LinkStatus . Resolved ;
60+ brokenLinkCriteria . LanguageCode = request . CultureName ;
61+
62+ var brokenLinkResult = await brokenLinkSearchService . SearchAsync ( brokenLinkCriteria ) ;
63+
64+ if ( brokenLinkResult . Results . Count > 0 )
65+ {
66+ var resultItem = brokenLinkResult . Results . FirstOrDefault ( x =>
67+ ( x . Language == request . CultureName ) ||
68+ ( ! request . CultureName . IsNullOrEmpty ( ) && x . Language . IsNullOrEmpty ( ) ) )
69+ ?? brokenLinkResult . Results . FirstOrDefault ( ) ;
70+
71+ result . RedirectUrl = resultItem ? . RedirectUrl ;
72+ }
73+ }
6274
6375 return result ;
6476 }
6577
6678 protected virtual async Task < SeoInfo > GetBestMatchingSeoInfo ( SeoSearchCriteria criteria , Store store )
6779 {
68- var itemsToMatch = await _seoResolver . FindSeoAsync ( criteria ) ;
80+ var itemsToMatch = await seoResolver . FindSeoAsync ( criteria ) ;
6981 return itemsToMatch . GetBestMatchingSeoInfo ( store , criteria . LanguageCode ) ;
7082 }
7183}
0 commit comments