diff --git a/FinlyticNews/Services/NewsDbService.cs b/FinlyticNews/Services/NewsDbService.cs index f1fd628..73a3912 100644 --- a/FinlyticNews/Services/NewsDbService.cs +++ b/FinlyticNews/Services/NewsDbService.cs @@ -104,9 +104,10 @@ public class NewsDbService : INewsDbService string? language = null) { var trimmedUrl = url.Trim(); + var cleanUrl = trimmedUrl.TrimEnd('.', '/'); var existingArticle = await _context.NewsArticles - .FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl); + .FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl || a.SourceUrl == cleanUrl || a.SourceUrl.StartsWith(cleanUrl)); if (existingArticle != null) { @@ -160,21 +161,14 @@ public class NewsDbService : INewsDbService } catch (DbUpdateException ex) { - _context.Entry(article).State = EntityState.Detached; - if (article.MatchedAssets != null) - { - foreach (var match in article.MatchedAssets) - { - _context.Entry(match).State = EntityState.Detached; - } - } + _context.ChangeTracker.Clear(); await _finlyticLogger.LogWarningAsync(SettingKeys.NewsChannel, "[NewsChannel] Unique constraint or concurrency hit during insert for URL: {Url}. Fetching existing fallback. ({Message})", trimmedUrl, ex.InnerException?.Message ?? ex.Message); - var existing = await _context.NewsArticles.AsNoTracking().FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl); + var existing = await _context.NewsArticles.AsNoTracking().FirstOrDefaultAsync(a => a.SourceUrl == trimmedUrl || a.SourceUrl == cleanUrl || a.SourceUrl.StartsWith(cleanUrl)); if (existing != null) { return existing; } - throw; + return article; } return article;