From 73a5e5183bf82fa2fc650aaf7f834d9a9430d5b4 Mon Sep 17 00:00:00 2001 From: "soroush.asadi" Date: Sat, 20 Jun 2026 15:54:07 +0330 Subject: [PATCH] fix(seed): IgnoreQueryFilters on all seeder queries + sitemap invalid date guard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DemoSeedService / DemoMenuSeeder: Add IgnoreQueryFilters() to every seeder lookup (Taxes, MenuCategories, MenuItems). Soft-deleted rows still hold their PKs; without this a second seed run after user-deletion throws a PK collision on the Tax or category that was soft-deleted but is still in the index. sitemap.ts: Guard new Date(post.date) against empty / missing frontmatter date fields. new Date("") = Invalid Date → broken in sitemap XML. Fall back to the build-time date when the post date is absent or invalid. Co-Authored-By: Claude Sonnet 4.6 --- src/Meezi.API/Services/DemoSeedService.cs | 5 ++++- src/Meezi.Infrastructure/Data/DemoMenuSeeder.cs | 4 +++- web/website/src/app/sitemap.ts | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Meezi.API/Services/DemoSeedService.cs b/src/Meezi.API/Services/DemoSeedService.cs index a7c0de9..78b199f 100644 --- a/src/Meezi.API/Services/DemoSeedService.cs +++ b/src/Meezi.API/Services/DemoSeedService.cs @@ -33,7 +33,9 @@ public class DemoSeedService : IDemoSeedService // 1. Ensure 9% default tax var taxId = $"{cafeId}_demo_tax"; var taxCreated = false; - if (!await _db.Taxes.AnyAsync(t => t.CafeId == cafeId && t.IsDefault, ct)) + // IgnoreQueryFilters: soft-deleted rows still occupy the PK; re-seeding + // after a user deletes demo data must see those rows to avoid a PK collision. + if (!await _db.Taxes.IgnoreQueryFilters().AnyAsync(t => t.CafeId == cafeId && t.IsDefault, ct)) { _db.Taxes.Add(new Tax { @@ -51,6 +53,7 @@ public class DemoSeedService : IDemoSeedService else { taxId = await _db.Taxes + .IgnoreQueryFilters() .Where(t => t.CafeId == cafeId && t.IsDefault) .Select(t => t.Id) .FirstAsync(ct); diff --git a/src/Meezi.Infrastructure/Data/DemoMenuSeeder.cs b/src/Meezi.Infrastructure/Data/DemoMenuSeeder.cs index d105eed..a63e763 100644 --- a/src/Meezi.Infrastructure/Data/DemoMenuSeeder.cs +++ b/src/Meezi.Infrastructure/Data/DemoMenuSeeder.cs @@ -23,7 +23,7 @@ public static class DemoMenuSeeder string Scoped(string catalogId) => useScopedIds ? $"{cafeId}_{catalogId}" : catalogId; - if (!await db.Taxes.AnyAsync(t => t.Id == taxId && t.CafeId == cafeId)) + if (!await db.Taxes.IgnoreQueryFilters().AnyAsync(t => t.Id == taxId && t.CafeId == cafeId)) { db.Taxes.Add(new Tax { @@ -38,6 +38,7 @@ public static class DemoMenuSeeder } var existingCategoryIds = await db.MenuCategories + .IgnoreQueryFilters() .Where(c => c.CafeId == cafeId) .ToDictionaryAsync(c => c.Id, StringComparer.Ordinal); @@ -78,6 +79,7 @@ public static class DemoMenuSeeder } var existingItemIds = await db.MenuItems + .IgnoreQueryFilters() .Where(i => i.CafeId == cafeId) .Select(i => i.Id) .ToListAsync(); diff --git a/web/website/src/app/sitemap.ts b/web/website/src/app/sitemap.ts index ca77f97..e7bfb91 100644 --- a/web/website/src/app/sitemap.ts +++ b/web/website/src/app/sitemap.ts @@ -42,9 +42,10 @@ export default function sitemap(): MetadataRoute.Sitemap { const posts = getAllPosts(locale); for (const post of posts) { + const postDate = post.date ? new Date(post.date) : null; entries.push({ url: `${BASE_URL}/${locale}/blog/${post.slug}`, - lastModified: new Date(post.date), + lastModified: postDate && !isNaN(postDate.getTime()) ? postDate : now, changeFrequency: "monthly", priority: 0.7, });