chore: delete seed
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user