11using Newtonsoft . Json ;
2+
23using System ;
34using System . Collections . Generic ;
45using System . IO ;
78using System . Net . Http ;
89using System . Threading ;
910using System . Threading . Tasks ;
10- using System . Web . Http ;
11+
1112using Umbraco . Cms . Integrations . SEO . Semrush . Configuration ;
1213using Umbraco . Cms . Integrations . SEO . Semrush . Models . Dtos ;
1314using Umbraco . Cms . Integrations . SEO . Semrush . Services ;
15+
16+ #if NETCOREAPP
17+ using Microsoft . AspNetCore . Hosting ;
18+ using Microsoft . AspNetCore . Mvc ;
19+
20+ using Umbraco . Cms . Web . Common . Attributes ;
21+ using Umbraco . Cms . Web . BackOffice . Controllers ;
22+ #else
23+ using System . Web ;
24+ using System . Web . Http ;
25+
26+ using Umbraco . Web . WebApi ;
1427using Umbraco . Web . Mvc ;
28+ #endif
1529
1630namespace Umbraco . Cms . Integrations . SEO . Semrush . Controllers
1731{
1832 [ PluginController ( "UmbracoCmsIntegrationsSemrush" ) ]
19- public class SemrushController : BaseController
33+ public class SemrushController : UmbracoAuthorizedApiController
2034 {
2135 // Using a static HttpClient (see: https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/).
2236 private readonly static HttpClient s_client = new HttpClient ( ) ;
@@ -26,9 +40,28 @@ public class SemrushController : BaseController
2640
2741 private static readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim ( ) ;
2842
43+ private readonly ISemrushTokenService _semrushTokenService ;
44+
45+ private readonly ICacheHelper _cacheHelper ;
46+
47+ private readonly TokenBuilder _tokenBuilder ;
48+
49+ #if NETCOREAPP
50+ private readonly IWebHostEnvironment _webHostEnvironment ;
51+
52+ public SemrushController ( IWebHostEnvironment webHostEnvironment , ISemrushTokenService semrushTokenService , ICacheHelper cacheHelper , TokenBuilder tokenBuilder )
53+ {
54+ _webHostEnvironment = webHostEnvironment ;
55+ #else
2956 public SemrushController ( ISemrushTokenService semrushTokenService , ICacheHelper cacheHelper , TokenBuilder tokenBuilder )
30- : base ( semrushTokenService , cacheHelper , tokenBuilder )
3157 {
58+
59+ #endif
60+ _semrushTokenService = semrushTokenService ;
61+
62+ _cacheHelper = cacheHelper ;
63+
64+ _tokenBuilder = tokenBuilder ;
3265 }
3366
3467 [ HttpGet ]
@@ -41,21 +74,21 @@ public SemrushController(ISemrushTokenService semrushTokenService, ICacheHelper
4174 [ HttpGet ]
4275 public TokenDto GetTokenDetails ( )
4376 {
44- return SemrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto tokenDto ) ? tokenDto : new TokenDto ( ) ;
77+ return _semrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto tokenDto ) ? tokenDto : new TokenDto ( ) ;
4578 }
4679
4780 [ HttpPost ]
4881 public void RevokeToken ( )
4982 {
50- SemrushTokenService . RemoveParameters ( SemrushSettings . TokenDbKey ) ;
83+ _semrushTokenService . RemoveParameters ( SemrushSettings . TokenDbKey ) ;
5184
52- CacheHelper . ClearCachedItems ( ) ;
85+ _cacheHelper . ClearCachedItems ( ) ;
5386 }
5487
5588 [ HttpPost ]
5689 public async Task < string > GetAccessToken ( [ FromBody ] AuthorizationRequestDto request )
5790 {
58- var requestData = TokenBuilder . ForAccessToken ( request . Code ) . Build ( ) ;
91+ var requestData = _tokenBuilder . ForAccessToken ( request . Code ) . Build ( ) ;
5992
6093 var requestMessage = new HttpRequestMessage
6194 {
@@ -70,7 +103,7 @@ public async Task<string> GetAccessToken([FromBody] AuthorizationRequestDto requ
70103 {
71104 var result = await response . Content . ReadAsStringAsync ( ) ;
72105
73- SemrushTokenService . SaveParameters ( SemrushSettings . TokenDbKey , result ) ;
106+ _semrushTokenService . SaveParameters ( SemrushSettings . TokenDbKey , result ) ;
74107
75108 return result ;
76109 }
@@ -81,7 +114,7 @@ public async Task<string> GetAccessToken([FromBody] AuthorizationRequestDto requ
81114 [ HttpPost ]
82115 public async Task < AuthorizationResponseDto > ValidateToken ( )
83116 {
84- SemrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto token ) ;
117+ _semrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto token ) ;
85118
86119 if ( ! token . IsAccessTokenAvailable ) return new AuthorizationResponseDto { IsExpired = true } ;
87120
@@ -94,16 +127,16 @@ public async Task<AuthorizationResponseDto> ValidateToken()
94127 IsFreeAccount = response . Headers . TryGetValues ( SemrushSettings . AllowLimitOffsetHeaderName ,
95128 out IEnumerable < string > values )
96129 ? values . First ( ) . Equals ( "0" )
97- : ( bool ? ) null
130+ : ( bool ? ) null
98131 } ;
99132 }
100133
101134 [ HttpPost ]
102135 public async Task < string > RefreshAccessToken ( )
103136 {
104- SemrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto token ) ;
137+ _semrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto token ) ;
105138
106- var requestData = TokenBuilder . ForRefreshToken ( token . RefreshToken ) . Build ( ) ;
139+ var requestData = _tokenBuilder . ForRefreshToken ( token . RefreshToken ) . Build ( ) ;
107140
108141 var requestMessage = new HttpRequestMessage
109142 {
@@ -118,7 +151,7 @@ public async Task<string> RefreshAccessToken()
118151 {
119152 var result = await response . Content . ReadAsStringAsync ( ) ;
120153
121- SemrushTokenService . SaveParameters ( SemrushSettings . TokenDbKey , result ) ;
154+ _semrushTokenService . SaveParameters ( SemrushSettings . TokenDbKey , result ) ;
122155
123156 return result ;
124157 }
@@ -131,7 +164,7 @@ public async Task<RelatedPhrasesDto> GetRelatedPhrases(string phrase, int pageNu
131164 {
132165 string cacheKey = $ "{ dataSource } -{ method } -{ phrase } ";
133166
134- if ( CacheHelper . TryGetCachedItem < RelatedPhrasesDto > ( cacheKey , out var relatedPhrasesDto ) && relatedPhrasesDto . Data != null )
167+ if ( _cacheHelper . TryGetCachedItem < RelatedPhrasesDto > ( cacheKey , out var relatedPhrasesDto ) && relatedPhrasesDto . Data != null )
135168 {
136169 relatedPhrasesDto . TotalPages = relatedPhrasesDto . Data . Rows . Count / SemrushSettings . DefaultPageSize ;
137170 relatedPhrasesDto . Data . Rows = relatedPhrasesDto . Data . Rows
@@ -142,7 +175,7 @@ public async Task<RelatedPhrasesDto> GetRelatedPhrases(string phrase, int pageNu
142175 return relatedPhrasesDto ;
143176 }
144177
145- SemrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto token ) ;
178+ _semrushTokenService . TryGetParameters ( SemrushSettings . TokenDbKey , out TokenDto token ) ;
146179
147180 var response = await ClientFactory ( )
148181 . GetAsync ( string . Format ( SemrushSettings . SemrushKeywordsEndpoint , method , token . AccessToken , phrase , dataSource ) ) ;
@@ -155,7 +188,7 @@ public async Task<RelatedPhrasesDto> GetRelatedPhrases(string phrase, int pageNu
155188
156189 if ( ! relatedPhrasesDeserialized . IsSuccessful ) return relatedPhrasesDeserialized ;
157190
158- CacheHelper . AddCachedItem ( cacheKey , responseContent ) ;
191+ _cacheHelper . AddCachedItem ( cacheKey , responseContent ) ;
159192
160193 relatedPhrasesDeserialized . TotalPages = relatedPhrasesDeserialized . Data . Rows . Count / SemrushSettings . DefaultPageSize ;
161194 relatedPhrasesDeserialized . Data . Rows = relatedPhrasesDeserialized . Data . Rows
@@ -172,19 +205,26 @@ public async Task<RelatedPhrasesDto> GetRelatedPhrases(string phrase, int pageNu
172205 [ HttpGet ]
173206 public DataSourceDto GetDataSources ( )
174207 {
208+ #if NETCOREAPP
209+ string semrushDataSourcesPath = $ "{ _webHostEnvironment . ContentRootPath } /App_Plugins/UmbracoCms.Integrations/SEO/Semrush/semrushDataSources.json";
210+ #else
211+ string semrushDataSourcesPath = HttpContext . Current . Server . MapPath (
212+ "/App_Plugins/UmbracoCms.Integrations/SEO/Semrush/semrushDataSources.json" ) ;
213+ #endif
214+
175215 _lock . EnterReadLock ( ) ;
176216
177217 try
178218 {
179- if ( ! File . Exists ( SemrushDataSourcesPath ) )
219+ if ( ! System . IO . File . Exists ( semrushDataSourcesPath ) )
180220 {
181- var fs = File . Create ( SemrushDataSourcesPath ) ;
221+ var fs = System . IO . File . Create ( semrushDataSourcesPath ) ;
182222 fs . Close ( ) ;
183223
184224 return new DataSourceDto ( ) ;
185225 }
186226
187- var content = File . ReadAllText ( SemrushDataSourcesPath ) ;
227+ var content = System . IO . File . ReadAllText ( semrushDataSourcesPath ) ;
188228 var dataSourceDto = new DataSourceDto
189229 {
190230 Items = JsonConvert . DeserializeObject < List < DataSourceItemDto > > ( content ) . Select ( p =>
@@ -212,19 +252,26 @@ public DataSourceDto GetDataSources()
212252 [ HttpGet ]
213253 public IEnumerable < ColumnDto > GetColumns ( )
214254 {
255+ #if NETCOREAPP
256+ string semrushColumnsPath = $ "{ _webHostEnvironment . ContentRootPath } /App_Plugins/UmbracoCms.Integrations/SEO/Semrush/semrushColumns.json";
257+ #else
258+ string semrushColumnsPath = HttpContext . Current . Server . MapPath (
259+ "/App_Plugins/UmbracoCms.Integrations/SEO/Semrush/semrushColumns.json" ) ;
260+ #endif
261+
215262 _lock . EnterReadLock ( ) ;
216263
217264 try
218265 {
219- if ( ! File . Exists ( SemrushColumnsPath ) )
266+ if ( ! System . IO . File . Exists ( semrushColumnsPath ) )
220267 {
221- var fs = File . Create ( SemrushColumnsPath ) ;
268+ var fs = System . IO . File . Create ( semrushColumnsPath ) ;
222269 fs . Close ( ) ;
223270
224271 return Enumerable . Empty < ColumnDto > ( ) ;
225272 }
226273
227- var content = File . ReadAllText ( SemrushColumnsPath ) ;
274+ var content = System . IO . File . ReadAllText ( semrushColumnsPath ) ;
228275 return JsonConvert . DeserializeObject < IEnumerable < ColumnDto > > ( content ) . Select ( p =>
229276 new ColumnDto
230277 {
0 commit comments