Skip to content

Commit 1974abc

Browse files
Enes Yağızclaude
andcommitted
fix(cache): look up empty release notes again when the repository changes
Versions looked up without a repository, or under a wrong one, were stored as empty and stayed empty for 30 days after the repository was corrected. A metadata refresh that finds a different repository now clears the source of those empty notes and queues a scrape, so they are read again once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 909791c commit 1974abc

1 file changed

Lines changed: 21 additions & 0 deletions

File tree

‎src/backend/PkgDiff.Application/Services/PackageCacheService.cs‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,27 @@ private async Task<PackageMetadata> BuildMetadataFromCache(CachedPackage cached,
233233
};
234234
}
235235

236+
private async Task ForgetEmptyReleaseNotesAsync(int cachedPackageId, string registry, string packageId)
237+
{
238+
var emptyNotes = (await _unitOfWork.CachedReleaseNotes
239+
.FindAsync(rn => rn.CachedPackageId == cachedPackageId && rn.IsEmpty && rn.ReleaseNotesSource != null))
240+
.ToList();
241+
if (emptyNotes.Count == 0)
242+
return;
243+
244+
foreach (var note in emptyNotes)
245+
note.ReleaseNotesSource = null;
246+
await _unitOfWork.SaveChangesAsync();
247+
248+
_jobs.Enqueue<IPackageAnalysisService>(service => service.ScrapePackageReleaseNotesAsync(packageId, registry));
249+
}
250+
236251
private async Task SaveFreshMetadataToCache(
237252
CachedPackage? cached, PackageMetadata metadata, string registry, string packageId)
238253
{
239254
var registryId = await ResolveRegistryIdAsync(registry);
240255

256+
var repositoryChanged = false;
241257
if (cached == null)
242258
{
243259
cached = new CachedPackage
@@ -263,6 +279,8 @@ private async Task SaveFreshMetadataToCache(
263279
cached.Authors = metadata.Authors;
264280
cached.IconUrl = metadata.IconUrl;
265281
cached.ProjectUrl = metadata.ProjectUrl;
282+
repositoryChanged = metadata.GitHubRepositoryUrl != null
283+
&& !string.Equals(metadata.GitHubRepositoryUrl, cached.GitHubRepositoryUrl, StringComparison.OrdinalIgnoreCase);
266284
// A repository found while scraping release notes is kept when the registry names none
267285
cached.GitHubRepositoryUrl = metadata.GitHubRepositoryUrl ?? cached.GitHubRepositoryUrl;
268286
cached.AllVersionsJson = JsonSerializer.Serialize(metadata.Versions.Select(v => v.Version));
@@ -273,6 +291,9 @@ private async Task SaveFreshMetadataToCache(
273291

274292
await _unitOfWork.SaveChangesAsync();
275293

294+
if (repositoryChanged)
295+
await ForgetEmptyReleaseNotesAsync(cached.Id, registry.ToLowerInvariant(), packageId);
296+
276297
var latestVersion = metadata.LatestVersion ?? string.Empty;
277298
var latestPublished = metadata.Versions.FirstOrDefault(v => v.Version == latestVersion)?.PublishedDate;
278299
await _liveUpdates.RecordLatestVersionAsync(cached, registry, latestVersion, latestPublished, authoritative: true);

0 commit comments

Comments
 (0)