chore: delete seed

This commit is contained in:
mirage
2026-03-26 11:32:11 +01:00
parent 2e9373a853
commit 00f87be105

View File

@@ -1,462 +0,0 @@
using Webzine.EntitiesContext;
using Webzine.Entity;
using Bogus;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Webzine.Repository
{
/// <summary>
/// Classe de service pour peupler la base de données avec des données fictives (mock data) à des fins de développement et de test.
/// </summary>
public class SeedMockData
{
private readonly WebzineDbContext _context;
private readonly Random _random;
/// <summary>
/// Constructeur pour l'utilisation avec base de données
/// </summary>
public SeedMockData(WebzineDbContext context)
{
_context = context;
_random = new Random();
}
/// <summary>
/// Constructeur pour l'utilisation en mémoire (sans base de données)
/// </summary>
public SeedMockData()
{
_random = new Random();
}
/// <summary>
/// Peuple la base de données avec des données fictives
/// </summary>
public void SeedDB()
{
// Vérifie si la base contient déjà des données
if (_context.Artistes.Any()) return;
// Génère toutes les données
var styles = GenererStyles(18);
var artistes = GenererArtistes(100);
var titres = GenererTitres(artistes, 500, 550);
var commentaires = GenererCommentaires(titres, 0, 5);
// Associe les styles aux titres
AssocierStylesAuxTitres(titres, styles);
// Sauvegarde dans la base
_context.SaveChanges();
}
/// <summary>
/// Génère des données fictives en mémoire sans base de données
/// </summary>
/// <returns>Tuple contenant toutes les données générées</returns>
public (List<Style> Styles, List<Artiste> Artistes, List<Titre> Titres, List<Commentaire> Commentaires) SeedLocal()
{
// Génère toutes les données
var styles = GenererStyles(18);
var artistes = GenererArtistes(100);
var titres = GenererTitres(artistes, 500, 550);
var commentaires = GenererCommentaires(titres, 0, 5);
// Associe les styles aux titres
AssocierStylesAuxTitres(titres, styles);
// Retourne les données sans les sauvegarder
return (styles, artistes, titres, commentaires);
}
/// <summary>
/// Génère une liste de styles musicaux
/// </summary>
private List<Style> GenererStyles(int count)
{
var styleFaker = new Faker<Style>("fr")
.RuleFor(s => s.Libelle, f => GenererStyleMusical(f))
.RuleFor(s => s.Titres, () => new List<Titre>());
var styles = styleFaker.Generate(count);
// Styles réalistes en français
var stylesRealistes = new[]
{
"Rock", "Pop", "Jazz", "Classique", "Hip Hop", "Électronique",
"Blues", "Country", "Reggae", "Metal", "Funk", "Soul",
"R&B", "Punk", "Disco", "Folk", "Ambient", "Techno",
"House", "Grunge", "Indie", "Alternative", "Ska", "Gospel",
"Chanson Française", "Variété", "Rap Français", "Musique du Monde"
};
for (int i = 0; i < Math.Min(stylesRealistes.Length, count); i++)
{
styles[i].Libelle = stylesRealistes[i];
}
if (_context != null)
{
_context.Styles.AddRange(styles);
}
return styles;
}
/// <summary>
/// Génère un style musical réaliste
/// </summary>
private string GenererStyleMusical(Bogus.Faker f)
{
var styles = new[]
{
"Rock Alternatif", "Pop Rock", "Jazz Fusion", "Électro", "Hip Hop Old School",
"Blues Rock", "Metal Progressif", "Funk Soul", "Reggae Dub", "House Music"
};
return f.PickRandom(styles);
}
/// <summary>
/// Génère une liste d'artistes
/// </summary>
private List<Artiste> GenererArtistes(int count)
{
var artistFaker = new Faker<Artiste>("fr")
.RuleFor(a => a.Nom, f => GenererNomArtiste(f))
.RuleFor(a => a.Biographie, f => GenererBiographieRealiste(f))
.RuleFor(a => a.Titres, () => new List<Titre>());
var artistes = artistFaker.Generate(count);
// Ajoute des noms d'artistes célèbres
var artistesCelebres = new[]
{
"Les Beatles", "Queen", "Michael Jackson", "Madonna", "Bob Dylan",
"David Bowie", "Prince", "Nirvana", "Pink Floyd", "Led Zeppelin",
"Les Rolling Stones", "U2", "The Who", "The Doors", "AC/DC",
"Metallica", "Radiohead", "Coldplay", "Arctic Monkeys", "The Smiths",
"Daft Punk", "Justice", "Miles Davis", "Nina Simone", "Aretha Franklin",
"Johnny Hallyday", "Édith Piaf", "Charles Aznavour", "Jacques Brel",
"Serge Gainsbourg", "Joe Dassin", "Claude François", "Jean-Jacques Goldman"
};
for (int i = 0; i < Math.Min(artistesCelebres.Length, count); i++)
{
artistes[i].Nom = artistesCelebres[i];
}
if (_context != null)
{
_context.Artistes.AddRange(artistes);
}
return artistes;
}
/// <summary>
/// Génère un nom d'artiste réaliste
/// </summary>
private string GenererNomArtiste(Bogus.Faker f)
{
var typesArtistes = new[]
{
f.Name.FullName(),
$"Les {f.Random.WordsArray(1)[0]}",
$"{f.Random.WordsArray(1)[0]} {f.Random.WordsArray(1)[0]}",
$"{f.Company.CompanyName()}",
$"{f.Name.FirstName()} et les {f.Random.WordsArray(1)[0]}"
};
return f.PickRandom(typesArtistes);
}
/// <summary>
/// Génère une biographie réaliste en français
/// </summary>
private string GenererBiographieRealiste(Bogus.Faker f)
{
var partiesBiographie = new List<string>();
// Début de carrière
partiesBiographie.Add($"Formé(e) en {f.Date.Past(50).Year}, {f.Name.FirstName()} a commencé son parcours musical à {f.Address.City()}.");
// Style musical
partiesBiographie.Add($"Sa musique mélange {f.Music.Genre()} avec des influences de {f.Music.Genre()} et de {f.Music.Genre()}.");
// Succès
partiesBiographie.Add($"Avec plus de {f.Random.Number(10, 500)} millions de disques vendus dans le monde, {f.Name.FirstName()} est devenu(e) l'un(e) des artistes les plus influent(e)s de sa génération.");
// Albums et tournées
partiesBiographie.Add($"L'album révolutionnaire est sorti en {f.Date.Past(20).Year}, suivi de tournées à guichets fermés en Europe, Amérique du Nord et Asie.");
// Récompenses
partiesBiographie.Add($"A remporté {f.Random.Number(1, 15)} Victoires de la Musique et a reçu des critiques élogieuses pour son approche innovante de la musique.");
// Activités récentes
partiesBiographie.Add($"Actuellement en train de travailler sur de nouveaux projets, {f.Name.FirstName()} continue de repousser les limites et d'inspirer les nouvelles générations de musiciens.");
return string.Join(" ", partiesBiographie);
}
/// <summary>
/// Génère une liste de titres
/// </summary>
private List<Titre> GenererTitres(List<Artiste> artistes, int minTitres, int maxTitres)
{
var tousLesTitres = new List<Titre>();
var totalTitres = _random.Next(minTitres, maxTitres + 1);
// Distribution des titres entre artistes
var titresParArtiste = new Dictionary<int, int>();
var titresRestants = totalTitres;
foreach (var artiste in artistes)
{
int nbTitres;
if (titresRestants > artistes.Count * 3)
{
nbTitres = _random.Next(3, 12);
}
else
{
nbTitres = _random.Next(1, 8);
}
nbTitres = Math.Min(nbTitres, titresRestants);
if (nbTitres <= 0) break;
titresParArtiste[artiste.IdArtiste] = nbTitres;
titresRestants -= nbTitres;
}
// Distribution des titres restants
while (titresRestants > 0)
{
var artisteAleatoire = artistes[_random.Next(artistes.Count)];
if (!titresParArtiste.ContainsKey(artisteAleatoire.IdArtiste))
{
titresParArtiste[artisteAleatoire.IdArtiste] = 0;
}
titresParArtiste[artisteAleatoire.IdArtiste]++;
titresRestants--;
}
// Génération des titres pour chaque artiste
foreach (var artiste in artistes)
{
var nbTitres = titresParArtiste.ContainsKey(artiste.IdArtiste) ?
titresParArtiste[artiste.IdArtiste] : _random.Next(1, 5);
if (nbTitres == 0) continue;
var titreFaker = new Faker<Titre>("fr")
.RuleFor(t => t.Libelle, f => GenererTitreChanson(f))
.RuleFor(t => t.Duree, f => _random.Next(90, 480))
.RuleFor(t => t.Chronique, f => GenererChroniqueRealiste(f))
.RuleFor(t => t.DateCreation, f => f.Date.PastOffset(3).DateTime)
.RuleFor(t => t.DateSortie, (f, t) => f.Date.Between(t.DateCreation, t.DateCreation.AddMonths(12)))
.RuleFor(t => t.UrlJaquette, f => GenererUrlPochette(f))
.RuleFor(t => t.UrlEcoute, f => GenererUrlStreaming(f))
.RuleFor(t => t.NbLectures, f => _random.Next(1000, 50000000))
.RuleFor(t => t.NbLikes, (f, t) => _random.Next(0, (int)(t.NbLectures * 0.15)))
.RuleFor(t => t.Album, f => GenererNomAlbum(f))
.RuleFor(t => t.IdArtiste, artiste.IdArtiste)
.RuleFor(t => t.Artiste, artiste)
.RuleFor(t => t.Styles, () => new List<Style>())
.RuleFor(t => t.Commentaires, () => new List<Commentaire>());
var titres = titreFaker.Generate(nbTitres);
tousLesTitres.AddRange(titres);
}
if (_context != null)
{
_context.Titres.AddRange(tousLesTitres);
}
return tousLesTitres;
}
/// <summary>
/// Génère un titre de chanson réaliste en français
/// </summary>
private string GenererTitreChanson(Bogus.Faker f)
{
var titresChansons = new[]
{
$"{f.Random.WordsArray(1, 3)[0]} {f.Random.WordsArray(1, 2)[0]}",
$"{f.Hacker.Verb()} mon {f.Commerce.ProductName()}",
$"La {f.Random.WordsArray(1)[0]} de {f.Random.WordsArray(1)[0]}",
$"{f.Name.FirstName()} {f.Random.WordsArray(1)[0]}",
$"Sous le ciel de {f.Address.City()}",
$"L'amour {f.Random.WordsArray(1)[0]}",
$"Je t'aime {f.Random.WordsArray(1)[0]}",
$"Les {f.Random.WordsArray(1)[0]} de Paris",
$"Mon {f.Random.WordsArray(1)[0]} préféré",
$"Une nuit à {f.Address.City()}"
};
return f.PickRandom(titresChansons);
}
/// <summary>
/// Génère une chronique réaliste en français
/// </summary>
private string GenererChroniqueRealiste(Bogus.Faker f)
{
var modelesChronique = new[]
{
$"Ce morceau met en valeur le {f.Music.Genre()} dans sa plus belle expression. Le rythme {f.Random.WordsArray(1)[0]} combiné aux mélodies {f.Random.WordsArray(1)[0]} crée une expérience inoubliable.",
$"Un chef-d'œuvre qui mélange {f.Music.Genre()} avec des éléments de {f.Music.Genre()}. La qualité de production est exceptionnelle, et les voix sont {f.Random.WordsArray(1)[0]}.",
$"Des premières notes jusqu'au crescendo final, cette chanson vous emmène dans un voyage à travers des paysages sonores {f.Random.WordsArray(1)[0]}. Hautement recommandé pour les fans de {f.Music.Genre()}.",
$"Avec son rythme {f.Random.WordsArray(1)[0]} et ses paroles profondes, ce titre est destiné à devenir un classique du {f.Music.Genre()}.",
$"Une approche innovante du {f.Music.Genre()} qui repousse les limites tout en restant accessible. Le refrain {f.Random.WordsArray(1)[0]} est particulièrement mémorable.",
$"Cette chanson démontre pourquoi {f.Name.FirstName()} est considéré comme un pionnier du {f.Music.Genre()}. L'arrangement {f.Random.WordsArray(1)[0]} est à la fois complexe et accessible.",
$"Une composition d'une beauté saisissante qui met en valeur la versatilité de l'artiste. Le pont {f.Random.WordsArray(1)[0]} apporte une touche surprenante qui élève l'ensemble."
};
var chronique = f.PickRandom(modelesChronique);
return chronique + " " + f.Lorem.Sentence(_random.Next(2, 5));
}
/// <summary>
/// Génère une URL de pochette d'album
/// </summary>
private string GenererUrlPochette(Bogus.Faker f)
{
return $"https://picsum.photos/id/{_random.Next(1, 1000)}/300/300";
}
/// <summary>
/// Génère une URL de streaming
/// </summary>
private string GenererUrlStreaming(Bogus.Faker f)
{
var plateformes = new[] { "spotify", "apple", "deezer", "youtube", "tidal", "amazon" };
var plateforme = f.PickRandom(plateformes);
return $"https://{plateforme}.com/track/{f.Random.AlphaNumeric(22)}";
}
/// <summary>
/// Génère un nom d'album réaliste en français
/// </summary>
private string GenererNomAlbum(Bogus.Faker f)
{
var modelesAlbum = new[]
{
$"{string.Join(" ", f.Random.WordsArray(2, 3))}",
$"{f.Random.WordsArray(1)[0]} {f.Random.WordsArray(1)[0]}",
$"L'album {string.Join(" ", f.Random.WordsArray(2))}",
$"{f.Company.CatchPhrase()}",
$"{f.Random.WordsArray(1)[0]} {f.Random.Number(1, 5)}",
$"Les {f.Random.WordsArray(1)[0]} de l'âme",
$"Voyage au cœur de {f.Address.City()}",
$"Entre {f.Random.WordsArray(1)[0]} et {f.Random.WordsArray(1)[0]}"
};
return f.PickRandom(modelesAlbum);
}
/// <summary>
/// Génère une liste de commentaires en français
/// </summary>
private List<Commentaire> GenererCommentaires(List<Titre> titres, int minCommentaires, int maxCommentaires)
{
var tousLesCommentaires = new List<Commentaire>();
var modelesCommentaires = new[]
{
"J'adore ce morceau! La mélodie est incroyable.",
"Super chanson, vraiment représentative du genre.",
"Pas mon style, mais je peux apprécier le travail.",
"C'est ma nouvelle chanson préférée! Je ne peux pas arrêter de l'écouter.",
"La qualité de production est exceptionnelle. Bravo!",
"Composition intéressante, bien qu'un peu répétitive au milieu.",
"Ce morceau me rappelle ma jeunesse. Pure nostalgie.",
"Travail brillant! L'artiste s'est surpassé.",
"Je l'ai écoutée en boucle toute la semaine. Tellement entraînante!",
"Les paroles sont tellement significatives et profondes.",
"Chanson parfaite pour un road trip ou un dimanche après-midi tranquille.",
"C'est ce que la musique moderne devrait être. Innovant!",
"Un peu trop produit à mon goût, mais reste agréable.",
"La partie instrumentale est particulièrement impressionnante.",
"J'ai hâte d'entendre plus de cet artiste!",
"Cette chanson me donne des frissons à chaque fois que je l'entends.",
"Fusion intéressante des genres. Son très unique.",
"Les voix sont incroyables! Quelle étendue et quelle émotion.",
"Ça va rester dans ma playlist pour longtemps.",
"Un véritable chef-d'œuvre du début à la fin.",
"Magnifique composition, les paroles touchent le cœur.",
"Du grand art! Une claque musicale.",
"Je suis subjugué par cette chanson, vraiment de la qualité.",
"La mélodie reste dans la tête, c'est un tube assuré.",
"Une belle découverte, je vais suivre cet artiste."
};
foreach (var titre in titres)
{
var nbCommentaires = _random.Next(minCommentaires, maxCommentaires + 1);
for (int i = 0; i < nbCommentaires; i++)
{
var commentaire = new Commentaire
{
Contenu = _random.Next(0, 3) == 0
? _random.Next(0, 2) == 0
? faker.PickRandom(modelesCommentaires) + " " + faker.Lorem.Sentence()
: faker.PickRandom(modelesCommentaires)
: faker.PickRandom(modelesCommentaires) + "\n\n" + faker.Lorem.Paragraph(),
Auteur = GenererNomUtilisateur(),
DateCreation = DateTime.Now.AddDays(-_random.Next(0, 730)),
IdTitre = titre.IdTitre,
Titre = titre
};
tousLesCommentaires.Add(commentaire);
}
}
if (_context != null)
{
_context.Commentaires.AddRange(tousLesCommentaires);
}
return tousLesCommentaires;
}
private readonly Bogus.Faker faker = new Bogus.Faker("fr");
/// <summary>
/// Génère un nom d'utilisateur réaliste
/// </summary>
private string GenererNomUtilisateur()
{
var typesUtilisateurs = new[]
{
faker.Internet.UserName(),
faker.Name.FirstName().ToLower() + _random.Next(10, 999),
"fan_de_musique_" + _random.Next(100, 999),
"melomane_" + faker.Random.WordsArray(1)[0].ToLower(),
"auditeur_" + _random.Next(1000, 9999)
};
return faker.PickRandom(typesUtilisateurs);
}
/// <summary>
/// Associe des styles aux titres
/// </summary>
private void AssocierStylesAuxTitres(List<Titre> titres, List<Style> styles)
{
foreach (var titre in titres)
{
var nbStyles = _random.Next(1, 4);
var stylesTitre = styles.OrderBy(x => _random.Next()).Take(nbStyles).ToList();
titre.Styles = stylesTitre;
}
}
}
}