using ManagerService.Data; using System.Linq; using System.Text.RegularExpressions; namespace ManagerService.Helpers { public static class SlugHelper { /// /// Premiers segments d'URL déjà pris par des routes de visitapp-web : un segment /// statique l'emporte sur [slug], l'instance serait donc inaccessible. /// private static readonly string[] ReservedSlugs = { "download", "demo", "api" }; public static bool IsTaken(MyInfoMateDbContext db, string slug) => ReservedSlugs.Contains(slug) || db.Instances.Any(i => i.WebSlug == slug); /// /// Generate a URL-safe slug from a name, appending "-1", "-2", etc. until unique among Instances.WebSlug. /// public static string GenerateUniqueSlug(MyInfoMateDbContext db, string name) { var slug = name.ToLowerInvariant(); slug = Regex.Replace(slug, @"[àáâãäå]", "a"); slug = Regex.Replace(slug, @"[èéêë]", "e"); slug = Regex.Replace(slug, @"[ìíîï]", "i"); slug = Regex.Replace(slug, @"[òóôõö]", "o"); slug = Regex.Replace(slug, @"[ùúûü]", "u"); slug = Regex.Replace(slug, @"[ç]", "c"); slug = Regex.Replace(slug, @"[ñ]", "n"); slug = Regex.Replace(slug, @"[^a-z0-9\s-]", ""); slug = Regex.Replace(slug, @"[\s-]+", "-").Trim('-'); var baseSlug = slug; var counter = 1; while (IsTaken(db, slug)) slug = $"{baseSlug}-{counter++}"; return slug; } } }