diff --git a/.gitignore b/.gitignore index a1d490a..5f2ade4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ obj/ riderModule.iml /_ReSharper.Caches/ [Ll]ogs/ -.idea/ \ No newline at end of file +.idea/ +/vs/ +/.vs/ diff --git a/Webzine.Documentation/Rapport/equip 1 - rapport.md b/Webzine.Documentation/Rapport/equip 1 - rapport.md deleted file mode 100644 index e69de29..0000000 diff --git a/Webzine.Documentation/Rapport/equipe 1 - rapport.md b/Webzine.Documentation/Rapport/equipe 1 - rapport.md new file mode 100644 index 0000000..76f195f --- /dev/null +++ b/Webzine.Documentation/Rapport/equipe 1 - rapport.md @@ -0,0 +1,21 @@ +**Loïc Masi** : + +04/03 : +- Création de 'AccueilController' + - Création de la fonction Index() -> afficher l'accueil du webzine +- Ajout de la vue 'Views/Accueil/Index.cshtml' +- Mise en place d'un Header dans 'Views/Shared/_Header.cshtml' +- Mise en place de la Sidebar dans 'Views/Shared/_Sidebar.cshtml' + +05/03 : +- Mise en place de fausse données dans 'Webzine.Repository' à l'aide de Faker +- Ajout du ViewModel pour afficher les informations nécessaire sur la page d'accueil +- Adaptation de quelques éléments sur la page (Bootstrap) +- Mise en place du parametrage du nombre d'elements a afficher sur la page dans appsettings +- Modifiaction du header pour ajouter le Dropdown (Administration) et ajout de quelques redirections + +06/03 : +- Récupération des modifications depuis 'dev' +- Ajout des redirections vers les pages 'Administration' +- Adaptation du layout principal pour adaptation entre public et administration +- Ajout du Footer (sur toutes les pages) \ No newline at end of file diff --git a/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj b/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj index 2e335bf..d7e20a3 100644 --- a/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj +++ b/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -16,7 +16,7 @@ - + @@ -25,4 +25,8 @@ + + + + diff --git a/Webzine.Entity/Artiste.cs b/Webzine.Entity/Artiste.cs new file mode 100644 index 0000000..8f1df08 --- /dev/null +++ b/Webzine.Entity/Artiste.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; +using System.Timers; + +namespace Webzine.Entity +{ + /// + /// Classe représentant un artiste. + /// Lien avec l'entité : un artiste peut avoir plusieurs titres, mais un titre n'a qu'un seul artiste. + /// + public class Artiste + { + /// + /// Identifiant unique de l'artiste. + /// + public int IdArtiste { get; set; } + + /// + /// Nom de l'artiste. Doit être compris entre 2 et 50 caractères et est obligatoire. + /// + [Required] + [MinLength(2)] + [MaxLength(50)] + [Display(Name = "Nom de l'artiste")] + public string Nom { get; set; } + + /// + /// Biographie de l'artiste, qui peut contenir une description de sa carrière, de son style musical, etc. Doit être compris entre 10 et 4000 caractères et est obligatoire. + /// + public string Biographie { get; set; } + + /// + /// Liste des titres associés à cet artiste. Un artiste peut avoir plusieurs titres, mais un titre n'a qu'un seul artiste. + /// + public List Titres { get; set; } + } +} diff --git a/Webzine.Entity/Commentaire.cs b/Webzine.Entity/Commentaire.cs new file mode 100644 index 0000000..baaa852 --- /dev/null +++ b/Webzine.Entity/Commentaire.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace Webzine.Entity +{ + /// + /// Classe représentant un commentaire laissé par un utilisateur sur un titre. + /// Lien avec l'entité : un titre peut avoir plusieurs commentaires, mais un commentaire n'a qu'un seul titre. + /// + public class Commentaire + { + /// + /// Identifiant unique du commentaire. + /// + public int IdCommentaire { get; set; } + + /// + /// Contenu du commentaire laissé par l'utilisateur. Doit être compris entre 10 et 1000 caractères et est obligatoire. + /// + [Required] + [MinLength(10)] + [MaxLength(1000)] + [Display(Name = "Commentaire")] + public string Contenu { get; set; } + + /// + /// Nom de l'auteur du commentaire. Doit être compris entre 2 et 30 caractères et est obligatoire. + /// + [Required] + [MinLength(2)] + [MaxLength(30)] + [Display(Name = "Nom")] + public string Auteur { get; set; } + + /// + /// Date de création du commentaire. Représente la date à laquelle le commentaire a été laissé par l'utilisateur. Doit être une date valide et est obligatoire. + /// + [Required] + [Display(Name = "Date de création")] + public DateTime DateCreation { get; set; } + + /// + /// Identifiant du titre associé à ce commentaire. Clé étrangère vers l'entité . + /// + public int IdTitre { get; set; } + + /// + /// Référence au titre associé à ce commentaire. Permet d'accéder aux informations du titre à partir du commentaire. + /// + public Titre Titre { get; set; } + } +} diff --git a/Webzine.Entity/Fixtures/ArtisteFactory.cs b/Webzine.Entity/Fixtures/ArtisteFactory.cs new file mode 100644 index 0000000..d8ecb26 --- /dev/null +++ b/Webzine.Entity/Fixtures/ArtisteFactory.cs @@ -0,0 +1,53 @@ +using Bogus; + +namespace Webzine.Entity.Fixtures +{ + /// + /// Factory pour générer des artistes avec des titres associés, à l'aide de la bibliothèque Bogus. + /// + public class ArtisteFactory + { + /// + /// Récupère un artiste par son nom, en générant des données fictives pour ses titres associés. + /// + /// Le nom de l'artiste à générer. + /// Un objet Artiste avec des titres associés générés de manière aléatoire. + public static Artiste SeedArtisteByName(string nom) + { + // On définit nos albums "bouchonnés" + var albumsData = new[] + { + new { Nom = "Bohemian Rhapsody", Image = "https://upload.wikimedia.org/wikipedia/en/9/9f/Bohemian_Rhapsody.png" }, + new { Nom = "Born This Way", Image = "https://static.wikia.nocookie.net/ladygaga/images/2/2d/BornThisWay-DeluxeEdition.jpg/revision/latest/scale-to-width-down/3500?cb=20111120030308" } + }; + + var faker = new Bogus.Faker("fr"); + var tousLesTitres = new List(); + + // Pour chaque album, on génère un paquet de titres + foreach (var album in albumsData) + { + var nombreDeTitres = faker.Random.Number(3, 6); + + var titresDeLalbum = new Faker("fr") + .RuleFor(t => t.IdTitre, f => f.IndexFaker + 1 + tousLesTitres.Count) + .RuleFor(t => t.UrlJaquette, _ => album.Image) + .RuleFor(t => t.Album, _ => album.Nom) + .RuleFor(t => t.Duree, f => f.Random.Number(90, 180)) + .RuleFor(t => t.Libelle, f => f.Music.Genre() + " - " + f.Commerce.ProductName()) + .Generate(nombreDeTitres); + + tousLesTitres.AddRange(titresDeLalbum); + } + + // On crée l'artiste final + var artisteFaker = new Faker("fr") + .RuleFor(a => a.IdArtiste, f => f.IndexFaker + 1) + .RuleFor(a => a.Nom, _ => nom) + .RuleFor(a => a.Biographie, f => f.Lorem.Paragraphs(2)) + .RuleFor(a => a.Titres, _ => tousLesTitres); + + return artisteFaker.Generate(); + } + } +} \ No newline at end of file diff --git a/Webzine.Entity/Fixtures/DataFactory.cs b/Webzine.Entity/Fixtures/DataFactory.cs new file mode 100644 index 0000000..8b6617d --- /dev/null +++ b/Webzine.Entity/Fixtures/DataFactory.cs @@ -0,0 +1,192 @@ +namespace Webzine.Entity.Fixtures; + +using Entity; +using Faker; +using System; +using System.Collections.Generic; +using System.Linq; + +public class DataFactory +{ + /// + /// Dictionnaire contenant des données de musique réelles pour les titres générés. + /// + public Dictionary RealMusicData { get; set; } + = new Dictionary + { + { "juliana_chahayed_1", ("https://open.spotify.com/intl-fr/track/0qYLUdJQMhrCFA9dNZGcnm?si=b4fd45727a354a31", + "https://i.scdn.co/image/ab67616d0000b2738e8e7b8f8f8f8f8f8f8f8f8") }, + + { "mister_v_1", ("https://youtu.be/JeqUw7sGUK8?si=FnmFR2EgkVY6MhqQ", + "https://img.youtube.com/vi/JeqUw7sGUK8/maxresdefault.jpg") }, + + { "compagnie_creole_1", ("https://youtu.be/wfxt1SGWAI8", + "https://img.youtube.com/vi/wfxt1SGWAI8/maxresdefault.jpg") }, + + { "femto_1", ("https://open.spotify.com/intl-fr/track/0qYLUdJQMhrCFA9dNZGcnm?si=b4fd45727a354a31", + "https://i.scdn.co/image/ab67616d0000b2738e8e7b8f8f8f8f8f8f8f8f8") }, + + { "chat_noir_1", ("https://youtu.be/OTi4-q-_Tj0?si=SNnLd-6Y893nL5Au", + "https://img.youtube.com/vi/OTi4-q-_Tj0/maxresdefault.jpg") }, + + { "chat_noir_2", ("https://youtu.be/X-rJ01EyiAI?si=gH9m_U8oXI35OgWu", + "https://img.youtube.com/vi/X-rJ01EyiAI/maxresdefault.jpg") }, + + { "chat_noir_3", ("https://youtu.be/7lIM0wSx7kQ?si=S-RAsLzd4SiCQhE4", + "https://img.youtube.com/vi/7lIM0wSx7kQ/maxresdefault.jpg") }, + + { "chat_noir_4", ("https://youtu.be/dbxyKR1P8vA?si=aRzdYBhwvKptV8Ff", + "https://img.youtube.com/vi/dbxyKR1P8vA/maxresdefault.jpg") }, + + { "chat_noir_5", ("https://youtu.be/DDHvKo5NnII?si=NFRkdVQL2mELP0yn", + "https://img.youtube.com/vi/DDHvKo5NnII/maxresdefault.jpg") }, + + { "chat_noir_6", ("https://youtu.be/J9LgHNf2Qy0?si=YGO1ggiLkefa9901", + "https://img.youtube.com/vi/J9LgHNf2Qy0/maxresdefault.jpg") }, + + { "chat_noir_7", ("https://youtu.be/oadhHk2xs6c?si=mbnJCA6SGsoYXnUK", + "https://img.youtube.com/vi/oadhHk2xs6c/maxresdefault.jpg") }, + + { "chat_noir_8", ("https://youtu.be/6K1zCgkBaoE?si=quq9vQLJ-AmzjRJJ", + "https://img.youtube.com/vi/6K1zCgkBaoE/maxresdefault.jpg") }, + + { "german_rapper_1", ("https://www.youtube.com/watch?v=DWpg71HJt24", + "https://img.youtube.com/vi/DWpg71HJt24/maxresdefault.jpg") }, + + { "nizard_1", ("https://youtu.be/1fjA68k8DAU?si=2PuZSquVQGvfmQkZ", + "https://img.youtube.com/vi/1fjA68k8DAU/maxresdefault.jpg") }, + }; + + /// + /// Génère une liste d'artistes de musique en utilisant la bibliothèque Faker pour créer des noms d'artistes et des biographies réalistes. + /// + /// Nombre d'artistes à générer + /// Liste d'artistes de musique générés + public List GenerateArtists(int count) + { + var artists = new List(); + + for (int i = 0; i < count; i++) + { + artists.Add(new Artiste + { + IdArtiste = i + 1, + Nom = Name.FullName(), + Biographie = Lorem.Paragraph(), + Titres = new List() + }); + } + + return artists; + } + + /// + /// Génère une liste de styles de musique à partir d'une liste prédéfinie de noms de styles. + /// + /// Nombre de styles à générer (maximum 15, car il y a 15 styles prédéfinis) + /// Liste de styles de musique générés + public List