@@ -238,6 +238,7 @@ public async Task ProcessWeatherAlertSourceAsync(Guid sourceId, CancellationToke
238238 source . LastPollUtc = DateTime . UtcNow ;
239239 source . LastSuccessUtc = DateTime . UtcNow ;
240240 source . IsFailure = false ;
241+ source . IsPermanentFailure = false ;
241242 source . ErrorMessage = null ;
242243 await _weatherAlertSourceRepository . UpdateAsync ( source , ct , true ) ;
243244 }
@@ -249,6 +250,7 @@ public async Task ProcessWeatherAlertSourceAsync(Guid sourceId, CancellationToke
249250 // user edits and saves it.
250251 source . LastPollUtc = DateTime . UtcNow ;
251252 source . IsFailure = true ;
253+ source . IsPermanentFailure = true ;
252254 source . ErrorMessage = ex . Message ;
253255 await _weatherAlertSourceRepository . UpdateAsync ( source , ct , true ) ;
254256 }
@@ -281,8 +283,7 @@ public async Task ProcessAllActiveSourcesAsync(CancellationToken ct = default)
281283 {
282284 // Skip sources with permanent failures (e.g. invalid zone codes).
283285 // They will be retried only after the user edits and saves the source.
284- if ( source . IsFailure && ! string . IsNullOrEmpty ( source . ErrorMessage ) &&
285- ! source . ErrorMessage . StartsWith ( "Transient:" ) )
286+ if ( source . IsFailure && source . IsPermanentFailure )
286287 continue ;
287288
288289 // Check if it's time to poll based on interval
0 commit comments