Compare commits

...

4 Commits

@ -1,9 +1,19 @@
namespace WF_WebAdmin.Converter namespace WF_WebAdmin.Converter
{ {
/// <summary>
/// Représente un objet de transfert de données (DTO) pour une citation quotidienne.
/// </summary>
public class DailyQuoteDTO public class DailyQuoteDTO
{ {
/// <summary>
/// Identifiant unique de la citation quotidienne.
/// </summary>
private int Id { get; set; } private int Id { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="DailyQuoteDTO"/> avec un identifiant.
/// </summary>
/// <param name="id">L'identifiant unique de la citation quotidienne.</param>
public DailyQuoteDTO(int id) public DailyQuoteDTO(int id)
{ {
this.Id = id; this.Id = id;

@ -2,10 +2,19 @@
namespace WF_WebAdmin.Converter namespace WF_WebAdmin.Converter
{ {
/// <summary>
/// Fournit des extensions pour convertir des objets de type <see cref="DailyQuote"/> en objets de type <see cref="DailyQuoteDTO"/>.
/// </summary>
public class DailyQuoteExtension public class DailyQuoteExtension
{ {
/// <summary>
/// Convertit une instance de <see cref="DailyQuote"/> en une instance de <see cref="DailyQuoteDTO"/>.
/// </summary>
/// <param name="dq">L'objet <see cref="DailyQuote"/> à convertir.</param>
/// <returns>Une instance de <see cref="DailyQuoteDTO"/> contenant l'identifiant de la citation quotidienne.</returns>
public DailyQuoteDTO DailyQuoteToDTO(DailyQuote dq) public DailyQuoteDTO DailyQuoteToDTO(DailyQuote dq)
{ {
// Création de l'objet DTO à partir de l'objet DailyQuote
DailyQuoteDTO dailyQuote = new DailyQuoteDTO(dq.Id); DailyQuoteDTO dailyQuote = new DailyQuoteDTO(dq.Id);
return dailyQuote; return dailyQuote;
} }

@ -3,25 +3,105 @@ using System;
namespace WF_WebAdmin.Converter namespace WF_WebAdmin.Converter
{ {
/// <summary>
/// Représente un objet Data Transfer Object (DTO) pour une citation.
/// </summary>
public class QuoteDTO public class QuoteDTO
{ {
/// <summary>
/// Identifiant de la citation.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Contenu de la citation.
/// </summary>
public string Content { get; set; } public string Content { get; set; }
/// <summary>
/// Nombre de "likes" de la citation.
/// </summary>
public int Likes { get; set; } public int Likes { get; set; }
/// <summary>
/// Langue de la citation.
/// </summary>
public string Langue { get; set; } public string Langue { get; set; }
/// <summary>
/// Indique si la citation est valide.
/// </summary>
public bool IsValide { get; set; } public bool IsValide { get; set; }
/// <summary>
/// Raison pour laquelle la citation pourrait être invalide.
/// </summary>
public string? Reason { get; set; } public string? Reason { get; set; }
/// <summary>
/// Identifiant du caractère associé à la citation (si applicable).
/// </summary>
public int? IdCaracter { get; set; } public int? IdCaracter { get; set; }
/// <summary>
/// Nom du caractère associé à la citation (si applicable).
/// </summary>
public string NameCharac { get; set; } public string NameCharac { get; set; }
/// <summary>
/// Identifiant de la source de la citation.
/// </summary>
public int? IdSource { get; set; } public int? IdSource { get; set; }
/// <summary>
/// Titre de la source de la citation.
/// </summary>
public string TitleSrc { get; set; } public string TitleSrc { get; set; }
/// <summary>
/// Date de la source de la citation.
/// </summary>
public DateTime DateSrc { get; set; } public DateTime DateSrc { get; set; }
/// <summary>
/// Identifiant de l'utilisateur qui a vérifié la citation (si applicable).
/// </summary>
public int? IdUserVerif { get; set; } public int? IdUserVerif { get; set; }
/// <summary>
/// Nom de l'utilisateur qui a vérifié la citation.
/// </summary>
public string NameUser { get; set; } public string NameUser { get; set; }
/// <summary>
/// Identifiant de l'image associée à la citation (si applicable).
/// </summary>
public int? IdImg { get; set; } public int? IdImg { get; set; }
/// <summary>
/// Chemin de l'image associée à la citation.
/// </summary>
public string ImgPath { get; set; } public string ImgPath { get; set; }
public QuoteDTO(int id_quote,string content,int likes,string langue,bool isValide,string? reason,int? id_caracter,string name_charac,int? id_source,string title,DateTime date,int? id_user_verif,string name_user ,int? id_img,string img_path) /// <summary>
/// Initialise une nouvelle instance de <see cref="QuoteDTO"/>.
/// </summary>
/// <param name="id_quote">L'identifiant de la citation.</param>
/// <param name="content">Le contenu de la citation.</param>
/// <param name="likes">Le nombre de likes de la citation.</param>
/// <param name="langue">La langue de la citation.</param>
/// <param name="isValide">Indique si la citation est valide.</param>
/// <param name="reason">La raison pour laquelle la citation peut être invalide.</param>
/// <param name="id_caracter">L'identifiant du caractère associé à la citation.</param>
/// <param name="name_charac">Le nom du caractère associé à la citation.</param>
/// <param name="id_source">L'identifiant de la source de la citation.</param>
/// <param name="title">Le titre de la source de la citation.</param>
/// <param name="date">La date de la source de la citation.</param>
/// <param name="id_user_verif">L'identifiant de l'utilisateur ayant vérifié la citation.</param>
/// <param name="name_user">Le nom de l'utilisateur ayant vérifié la citation.</param>
/// <param name="id_img">L'identifiant de l'image associée à la citation.</param>
/// <param name="img_path">Le chemin de l'image associée à la citation.</param>
public QuoteDTO(int id_quote, string content, int likes, string langue, bool isValide, string? reason, int? id_caracter, string name_charac, int? id_source, string title, DateTime date, int? id_user_verif, string name_user, int? id_img, string img_path)
{ {
this.Id = id_quote; this.Id = id_quote;
this.Content = content; this.Content = content;
@ -37,7 +117,7 @@ namespace WF_WebAdmin.Converter
this.IdUserVerif = id_user_verif; this.IdUserVerif = id_user_verif;
this.NameUser = name_user; this.NameUser = name_user;
this.IdImg = id_img; this.IdImg = id_img;
this.ImgPath =img_path; this.ImgPath = img_path;
} }
} }
} }

@ -2,17 +2,59 @@
namespace WF_WebAdmin.Converter namespace WF_WebAdmin.Converter
{ {
/// <summary>
/// Classe d'extension pour la conversion entre les objets <see cref="Quote"/> et <see cref="QuoteDTO"/>.
/// </summary>
public class QuoteExtension public class QuoteExtension
{ {
/// <summary>
/// Convertit un objet <see cref="Quote"/> en un objet <see cref="QuoteDTO"/>.
/// </summary>
/// <param name="q">L'objet <see cref="Quote"/> à convertir.</param>
/// <returns>Un objet <see cref="QuoteDTO"/> contenant les données de l'objet <see cref="Quote"/>.</returns>
public QuoteDTO QuoteToDTO(Quote q) public QuoteDTO QuoteToDTO(Quote q)
{ {
QuoteDTO quote = new QuoteDTO(q.Id, q.Content, q.Like, q.Langue, q.IsValid,null, null,q.Charac,null,q.TitleSrc,q.DateSrc,null,q.UserProposition,null,q.ImgPath); // Conversion des propriétés de Quote en QuoteDTO
QuoteDTO quote = new QuoteDTO(
q.Id,
q.Content,
q.Like,
q.Langue,
q.IsValid,
null, // Reason non défini ici
null, // IdCaracter non défini ici
q.Charac,
null, // IdSource non défini ici
q.TitleSrc,
q.DateSrc,
null, // IdUserVerif non défini ici
q.UserProposition,
null, // IdImg non défini ici
q.ImgPath
);
return quote; return quote;
} }
/// <summary>
/// Convertit un objet <see cref="QuoteDTO"/> en un objet <see cref="Quote"/>.
/// </summary>
/// <param name="q">L'objet <see cref="QuoteDTO"/> à convertir.</param>
/// <returns>Un objet <see cref="Quote"/> contenant les données de l'objet <see cref="QuoteDTO"/>.</returns>
public Quote DTOToQuote(QuoteDTO q) public Quote DTOToQuote(QuoteDTO q)
{ {
Quote quote = new Quote(q.Id, q.Content,q.NameCharac,q.ImgPath,q.TitleSrc,q.DateSrc,q.Likes,q.Langue,q.NameUser,q.IsValide); // Conversion des propriétés de QuoteDTO en Quote
Quote quote = new Quote(
q.Id,
q.Content,
q.NameCharac,
q.ImgPath,
q.TitleSrc,
q.DateSrc,
q.Likes,
q.Langue,
q.NameUser,
q.IsValide
);
return quote; return quote;
} }
} }

@ -2,19 +2,51 @@
namespace WF_WebAdmin.Converter namespace WF_WebAdmin.Converter
{ {
/// <summary>
/// Représente un objet Data Transfer Object (DTO) pour un utilisateur.
/// Utilisé pour transmettre les informations d'un utilisateur entre différentes couches de l'application.
/// </summary>
public class UserDTO public class UserDTO
{ {
/// <summary>
/// Obtient ou définit l'image de l'utilisateur.
/// </summary>
public string Image { get; set; } public string Image { get; set; }
/// <summary>
/// Obtient ou définit le nom de l'utilisateur.
/// </summary>
public string Name { get; set; } public string Name { get; set; }
/// <summary>
/// Obtient ou définit l'adresse email de l'utilisateur.
/// </summary>
public string Email { get; set; } public string Email { get; set; }
/// <summary>
/// Obtient ou définit la date de création de l'utilisateur.
/// </summary>
public DateTime DateCreation { get; set; } public DateTime DateCreation { get; set; }
/// <summary>
/// Obtient ou définit une valeur indiquant si l'utilisateur est un administrateur.
/// </summary>
public Boolean IsAdmin { get; set; } public Boolean IsAdmin { get; set; }
/// <summary>
/// Obtient ou définit la liste des commentaires associés à l'utilisateur.
/// </summary>
public List<Commentary> Comments { get; set; } public List<Commentary> Comments { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="UserDTO"/> avec les informations de base d'un utilisateur.
/// </summary>
/// <param name="image">L'image de l'utilisateur.</param>
/// <param name="name">Le nom de l'utilisateur.</param>
/// <param name="email">L'email de l'utilisateur.</param>
/// <param name="dateCreation">La date de création du compte utilisateur.</param>
public UserDTO(string image, string name, string email, DateTime dateCreation) public UserDTO(string image, string name, string email, DateTime dateCreation)
{ {
this.Image = image; this.Image = image;
this.Name = name; this.Name = name;
this.Email = email; this.Email = email;

@ -2,16 +2,31 @@
namespace WF_WebAdmin.Converter namespace WF_WebAdmin.Converter
{ {
/// <summary>
/// Classe d'extension permettant la conversion entre un utilisateur et son Data Transfer Object (DTO).
/// </summary>
public class UserExtension public class UserExtension
{ {
/// <summary>
/// Convertit un objet <see cref="UserDTO"/> en un objet <see cref="User"/>.
/// </summary>
/// <param name="u">L'objet <see cref="UserDTO"/> à convertir.</param>
/// <returns>Retourne un nouvel objet <see cref="User"/> avec les données du DTO.</returns>
public User UserToDTO(UserDTO u) public User UserToDTO(UserDTO u)
{ {
User user = new User(u.Image, u.Name, u.Email, u.DateCreation,u.IsAdmin); // Création d'un objet User à partir des données du DTO
User user = new User(u.Image, u.Name, u.Email, u.DateCreation, u.IsAdmin);
return user; return user;
} }
/// <summary>
/// Convertit un objet <see cref="User"/> en un objet <see cref="UserDTO"/>.
/// </summary>
/// <param name="u">L'objet <see cref="User"/> à convertir.</param>
/// <returns>Retourne un nouvel objet <see cref="UserDTO"/> avec les données de l'utilisateur.</returns>
public UserDTO DTOToUser(User u) public UserDTO DTOToUser(User u)
{ {
// Création d'un objet UserDTO à partir des données de l'utilisateur
UserDTO user = new UserDTO(u.Image, u.Name, u.Email, u.DateCreation); UserDTO user = new UserDTO(u.Image, u.Name, u.Email, u.DateCreation);
return user; return user;
} }

@ -1,13 +0,0 @@
namespace WF_WebAdmin.Data
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}
}

@ -1,20 +0,0 @@
namespace WF_WebAdmin.Data
{
public class WeatherForecastService
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
{
return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
}).ToArray());
}
}
}

@ -1,8 +1,18 @@
namespace WF_WebAdmin.Model namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente un personnage dans le système.
/// </summary>
public class Character public class Character
{ {
public int id_caracter { get; set; } /// <summary>
public string caracter { get; set; } /// Identifiant unique du personnage.
/// </summary>
public int id_caracter { get; set; }
/// <summary>
/// Nom ou description du personnage.
/// </summary>
public string caracter { get; set; }
} }
} }

@ -1,10 +1,21 @@
namespace WF_WebAdmin.Model namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente un commentaire dans le système.
/// </summary>
public class Commentary public class Commentary
{ {
//public int Id { get; set; } //public int Id { get; set; }
//public int IdUser { get; set; } //public int IdUser { get; set; }
public string Text { get; set; }
/// <summary>
/// Le texte du commentaire.
/// </summary>
public string Text { get; set; }
/// <summary>
/// La date de création du commentaire.
/// </summary>
public DateTime DateCreation { get; set; } public DateTime DateCreation { get; set; }
} }
} }

@ -1,9 +1,19 @@
namespace WF_WebAdmin.Model namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente une citation quotidienne dans le système.
/// </summary>
public class DailyQuote public class DailyQuote
{ {
/// <summary>
/// Identifiant unique de la citation quotidienne.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="DailyQuote"/>.
/// </summary>
/// <param name="Id">L'identifiant de la citation quotidienne.</param>
public DailyQuote(int Id) public DailyQuote(int Id)
{ {
this.Id = Id; this.Id = Id;

@ -1,17 +1,67 @@
namespace WF_WebAdmin.Model namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente un quiz avec une question et plusieurs réponses possibles.
/// </summary>
public class Quiz public class Quiz
{ {
/// <summary>
/// Identifiant unique du quiz.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// La question posée dans le quiz.
/// </summary>
public string Question { get; set; } public string Question { get; set; }
/// <summary>
/// Réponse A possible pour le quiz.
/// </summary>
public string AnswerA { get; set; } public string AnswerA { get; set; }
/// <summary>
/// Réponse B possible pour le quiz.
/// </summary>
public string AnswerB { get; set; } public string AnswerB { get; set; }
/// <summary>
/// Réponse C possible pour le quiz.
/// </summary>
public string AnswerC { get; set; } public string AnswerC { get; set; }
/// <summary>
/// Réponse D possible pour le quiz.
/// </summary>
public string AnswerD { get; set; } public string AnswerD { get; set; }
/// <summary>
/// Réponse correcte au quiz (A, B, C ou D).
/// </summary>
public string CAnswer { get; set; } public string CAnswer { get; set; }
/// <summary>
/// Indique si le quiz est valide.
/// </summary>
public bool IsValid { get; set; } public bool IsValid { get; set; }
/// <summary>
/// Proposition de l'utilisateur pour valider le quiz.
/// </summary>
public string UserProposition { get; set; } public string UserProposition { get; set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Quiz"/>.
/// </summary>
/// <param name="id">L'identifiant du quiz.</param>
/// <param name="question">La question posée dans le quiz.</param>
/// <param name="answerA">Réponse A possible.</param>
/// <param name="answerB">Réponse B possible.</param>
/// <param name="answerC">Réponse C possible.</param>
/// <param name="answerD">Réponse D possible.</param>
/// <param name="cAnswer">Réponse correcte (A, B, C ou D).</param>
/// <param name="isValid">Indique si le quiz est valide.</param>
/// <param name="userProposition">Proposition de l'utilisateur.</param>
public Quiz(int id, string question, string answerA, string answerB, string answerC, string answerD, string cAnswer, bool isValid, string userProposition) public Quiz(int id, string question, string answerA, string answerB, string answerC, string answerD, string cAnswer, bool isValid, string userProposition)
{ {
Id = id; Id = id;
@ -25,6 +75,16 @@ namespace WF_WebAdmin.Model
UserProposition = userProposition; UserProposition = userProposition;
} }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="Quiz"/> avec une valeur par défaut pour la validité et la proposition de l'utilisateur.
/// </summary>
/// <param name="id">L'identifiant du quiz.</param>
/// <param name="question">La question posée dans le quiz.</param>
/// <param name="answerA">Réponse A possible.</param>
/// <param name="answerB">Réponse B possible.</param>
/// <param name="answerC">Réponse C possible.</param>
/// <param name="answerD">Réponse D possible.</param>
/// <param name="cAnswer">Réponse correcte (A, B, C ou D).</param>
public Quiz(int id, string question, string answerA, string answerB, string answerC, string answerD, string cAnswer) public Quiz(int id, string question, string answerA, string answerB, string answerC, string answerD, string cAnswer)
{ {
Id = id; Id = id;
@ -38,7 +98,9 @@ namespace WF_WebAdmin.Model
UserProposition = "Admin"; UserProposition = "Admin";
} }
/// <summary>
/// Constructeur par défaut pour la classe <see cref="Quiz"/>.
/// </summary>
public Quiz() {} public Quiz() {}
} }
} }

@ -2,28 +2,55 @@
namespace WF_WebAdmin.Model namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Modèle représentant les données nécessaires à la création ou à la modification d'un quiz.
/// </summary>
public class QuizModel public class QuizModel
{ {
/// <summary>
/// Question posée dans le quiz.
/// Cette propriété est obligatoire et doit être d'une longueur maximale de 200 caractères.
/// </summary>
[Required] [Required]
[StringLength(200, ErrorMessage = "La question ne peut pas depasser les 200 caractère.")] [StringLength(200, ErrorMessage = "La question ne peut pas depasser les 200 caractère.")]
public string Question { get; set; } public string Question { get; set; }
/// <summary>
/// Première réponse possible pour le quiz.
/// Cette propriété est obligatoire et doit être d'une longueur maximale de 50 caractères.
/// </summary>
[Required] [Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")] [StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerA { get; set; } public string AnswerA { get; set; }
/// <summary>
/// Deuxième réponse possible pour le quiz.
/// Cette propriété est obligatoire et doit être d'une longueur maximale de 50 caractères.
/// </summary>
[Required] [Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")] [StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerB { get; set; } public string AnswerB { get; set; }
/// <summary>
/// Troisième réponse possible pour le quiz.
/// Cette propriété est obligatoire et doit être d'une longueur maximale de 50 caractères.
/// </summary>
[Required] [Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")] [StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerC { get; set; } public string AnswerC { get; set; }
/// <summary>
/// Quatrième réponse possible pour le quiz.
/// Cette propriété est obligatoire et doit être d'une longueur maximale de 50 caractères.
/// </summary>
[Required] [Required]
[StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")] [StringLength(50, ErrorMessage = "La réponse ne peut pas depasser les 50 caractère.")]
public string AnswerD { get; set; } public string AnswerD { get; set; }
/// <summary>
/// Réponse correcte au quiz, choisie parmi A, B, C ou D.
/// Cette propriété est obligatoire.
/// </summary>
[Required] [Required]
public string CAnswer { get; set; } public string CAnswer { get; set; }
} }

@ -1,20 +1,73 @@
using Microsoft.AspNetCore.DataProtection.KeyManagement; namespace WF_WebAdmin.Model
namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente une citation dans le système.
/// </summary>
public class Quote public class Quote
{ {
/// <summary>
/// Identifiant unique de la citation.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Contenu de la citation.
/// </summary>
public string Content { get; set; } public string Content { get; set; }
/// <summary>
/// Nombre de "likes" reçus pour cette citation.
/// </summary>
public int Like { get; set; } public int Like { get; set; }
/// <summary>
/// Langue dans laquelle la citation est écrite.
/// </summary>
public string Langue { get; set; } public string Langue { get; set; }
/// <summary>
/// Caractère associé à la citation (ex : personnage, auteur, etc.).
/// </summary>
public string Charac { get; set; } public string Charac { get; set; }
/// <summary>
/// Chemin d'accès à l'image associée à la citation.
/// </summary>
public string ImgPath { get; set; } public string ImgPath { get; set; }
/// <summary>
/// Titre de la source de la citation (ex : livre, film, etc.).
/// </summary>
public string TitleSrc { get; set; } public string TitleSrc { get; set; }
/// <summary>
/// Date de la source de la citation.
/// </summary>
public DateTime DateSrc { get; set; } public DateTime DateSrc { get; set; }
/// <summary>
/// Nom de l'utilisateur ayant proposé la citation.
/// </summary>
public string UserProposition { get; set; } public string UserProposition { get; set; }
/// <summary>
/// Indique si la citation est valide.
/// </summary>
public bool IsValid { get; set; } public bool IsValid { get; set; }
/// <summary>
/// Constructeur pour créer une nouvelle citation avec tous ses attributs.
/// </summary>
/// <param name="id">Identifiant de la citation.</param>
/// <param name="content">Contenu de la citation.</param>
/// <param name="charac">Caractère associé à la citation.</param>
/// <param name="imgPath">Chemin de l'image associée.</param>
/// <param name="titleSrc">Titre de la source.</param>
/// <param name="dateSrc">Date de la source.</param>
/// <param name="like">Nombre de "likes" reçus.</param>
/// <param name="langue">Langue de la citation.</param>
/// <param name="userProposition">Nom de l'utilisateur ayant proposé la citation.</param>
/// <param name="isvalid">Indicateur de validité de la citation.</param>
public Quote(int id, string content, string charac, string imgPath, string titleSrc, DateTime dateSrc, int like, string langue, string userProposition, bool isvalid) public Quote(int id, string content, string charac, string imgPath, string titleSrc, DateTime dateSrc, int like, string langue, string userProposition, bool isvalid)
{ {
Id = id; Id = id;
@ -28,6 +81,15 @@ namespace WF_WebAdmin.Model
UserProposition = userProposition; UserProposition = userProposition;
IsValid = isvalid; IsValid = isvalid;
} }
}
}
/* /*
public int Id { get; set; } public int Id { get; set; }
public string Content { get; set; } public string Content { get; set; }
@ -65,5 +127,5 @@ namespace WF_WebAdmin.Model
IdUserVerif = idUserVerif; IdUserVerif = idUserVerif;
} }
*/ */
}
}

@ -1,27 +1,65 @@
using System.ComponentModel.DataAnnotations; namespace WF_WebAdmin.Model
namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Modèle représentant une citation dans le système.
/// Ce modèle est utilisé pour la validation des données avant leur persistance.
/// </summary>
public class QuoteModel public class QuoteModel
{ {
/// <summary>
/// Identifiant unique de la citation.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Contenu de la citation.
/// La citation ne peut pas dépasser 300 caractères.
/// </summary>
[Required] [Required]
[StringLength(300, ErrorMessage = "La citation ne peut pas dépasser les 300 caractère.")] [StringLength(300, ErrorMessage = "La citation ne peut pas dépasser les 300 caractères.")]
public string Content { get; set; } public string Content { get; set; }
/// <summary>
/// Nombre de "likes" que la citation a reçus.
/// </summary>
public int Like { get; set; } public int Like { get; set; }
/// <summary>
/// Langue dans laquelle la citation est écrite.
/// La langue est limitée à 2 caractères.
/// </summary>
[Required] [Required]
[StringLength(2, ErrorMessage = "La langue ne peut pas dépasser 2 caractère.")] [StringLength(2, ErrorMessage = "La langue ne peut pas dépasser 2 caractères.")]
public string Langue { get; set; } public string Langue { get; set; }
/// <summary>
/// Caractère associé à la citation (ex : auteur ou personnage).
/// </summary>
public string Charac { get; set; } public string Charac { get; set; }
/// <summary>
/// Chemin d'accès à l'image associée à la citation.
/// </summary>
public string ImgPath { get; set; } public string ImgPath { get; set; }
/// <summary>
/// Titre de la source de la citation (ex : livre, film, etc.).
/// </summary>
public string TitleSrc { get; set; } public string TitleSrc { get; set; }
/// <summary>
/// Date de la source de la citation.
/// </summary>
public DateTime DateSrc { get; set; } public DateTime DateSrc { get; set; }
/// <summary>
/// Nom de l'utilisateur ayant proposé la citation.
/// </summary>
public string UserProposition { get; set; } public string UserProposition { get; set; }
/// <summary>
/// Indique si la citation est validée par le système.
/// </summary>
public bool IsValid { get; set; } public bool IsValid { get; set; }
} }
} }

@ -1,11 +1,25 @@
namespace WF_WebAdmin.Model namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente une source d'une citation dans le système.
/// Cette classe contient des informations sur la source d'une citation, telles que son titre et sa date de publication.
/// </summary>
public class Source public class Source
{ {
public int id_source { get; set; } /// <summary>
/// Identifiant unique de la source.
/// </summary>
public int id_source { get; set; }
/// <summary>
/// Titre de la source, tel qu'un livre, un article ou une œuvre.
/// </summary>
public string title { get; set; } public string title { get; set; }
public int date { get; set; } /// <summary>
/// Date de publication de la source.
/// Il s'agit d'une représentation de l'année sous forme d'entier.
/// </summary>
public int date { get; set; }
} }
} }

@ -1,17 +1,55 @@
namespace WF_WebAdmin.Model namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente un utilisateur dans le système.
/// Cette classe contient des informations sur l'utilisateur, telles que son image, son nom, son email, la date de création de son compte,
/// son statut d'administrateur et les commentaires qu'il a publiés.
/// </summary>
public class User public class User
{ {
/// <summary>
/// Identifiant unique de l'utilisateur.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
public string Image { get; set; }
/// <summary>
/// URL de l'image de profil de l'utilisateur.
/// </summary>
public string Image { get; set; }
/// <summary>
/// Nom de l'utilisateur.
/// </summary>
public string Name { get; set; } public string Name { get; set; }
/// <summary>
/// Adresse email de l'utilisateur.
/// </summary>
public string Email { get; set; } public string Email { get; set; }
/// <summary>
/// Date de création du compte utilisateur.
/// </summary>
public DateTime DateCreation { get; set; } public DateTime DateCreation { get; set; }
public Boolean IsAdmin { get; set; } /// <summary>
/// Indique si l'utilisateur a des privilèges d'administrateur.
/// </summary>
public bool IsAdmin { get; set; }
/// <summary>
/// Liste des commentaires publiés par l'utilisateur.
/// </summary>
public List<Commentary> Comments { get; set; } public List<Commentary> Comments { get; set; }
/// <summary>
/// Constructeur pour créer un nouvel utilisateur avec des informations spécifiques.
/// </summary>
/// <param name="image">URL de l'image de profil de l'utilisateur.</param>
/// <param name="name">Nom de l'utilisateur.</param>
/// <param name="email">Adresse email de l'utilisateur.</param>
/// <param name="dateCreation">Date de création du compte de l'utilisateur.</param>
/// <param name="isAdmin">Indicateur si l'utilisateur est un administrateur.</param>
public User(string image, string name, string email, DateTime dateCreation, bool isAdmin) public User(string image, string name, string email, DateTime dateCreation, bool isAdmin)
{ {
this.Image = image; this.Image = image;
@ -21,6 +59,9 @@
IsAdmin = isAdmin; IsAdmin = isAdmin;
} }
/// <summary>
/// Constructeur par défaut pour créer un utilisateur sans initialiser ses propriétés.
/// </summary>
public User() { } public User() { }
} }
} }

@ -1,14 +1,45 @@
using System; namespace WF_WebAdmin.Model
namespace WF_WebAdmin.Model
{ {
/// <summary>
/// Représente un utilisateur dans le système de connexion.
/// Cette classe contient des informations nécessaires pour l'authentification et la gestion du profil utilisateur.
/// </summary>
public class UserLogin public class UserLogin
{ {
/// <summary>
/// Identifiant unique de l'utilisateur.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// URL de l'image de profil de l'utilisateur.
/// </summary>
public string Image { get; set; } public string Image { get; set; }
public string Name { get; set;}
public Boolean IsAdmin { get; set; } /// <summary>
/// Nom de l'utilisateur.
/// </summary>
public string Name { get; set; }
/// <summary>
/// Indique si l'utilisateur possède des privilèges d'administrateur.
/// </summary>
public bool IsAdmin { get; set; }
/// <summary>
/// Mot de passe de l'utilisateur.
/// </summary>
public string Mdp { get; set; } public string Mdp { get; set; }
public UserLogin(int id,string image, string name, bool isAdmin, string mdp)
/// <summary>
/// Constructeur pour créer un objet <see cref="UserLogin"/> avec des informations d'authentification et de profil.
/// </summary>
/// <param name="id">Identifiant de l'utilisateur.</param>
/// <param name="image">URL de l'image de profil de l'utilisateur.</param>
/// <param name="name">Nom de l'utilisateur.</param>
/// <param name="isAdmin">Indicateur si l'utilisateur est un administrateur.</param>
/// <param name="mdp">Mot de passe de l'utilisateur.</param>
public UserLogin(int id, string image, string name, bool isAdmin, string mdp)
{ {
Id = id; Id = id;
this.Image = image; this.Image = image;
@ -17,6 +48,9 @@ namespace WF_WebAdmin.Model
this.Mdp = mdp; this.Mdp = mdp;
} }
/// <summary>
/// Constructeur par défaut pour créer un objet <see cref="UserLogin"/> sans initialiser les propriétés.
/// </summary>
public UserLogin() { } public UserLogin() { }
} }
} }

@ -3,25 +3,45 @@ using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using WF_WebAdmin.Model; using WF_WebAdmin.Model;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Page d'accueil qui affiche des citations quotidiennes.
/// </summary>
public partial class Accueil public partial class Accueil
{ {
/// <summary>
/// Tableau contenant les citations quotidiennes.
/// </summary>
private Quote[] Dailyquote; private Quote[] Dailyquote;
/// <summary>
/// Service HttpClient pour faire des requêtes HTTP.
/// </summary>
[Inject] [Inject]
public HttpClient Http { get; set; } public HttpClient Http { get; set; }
/// <summary>
/// Service NavigationManager pour la gestion de la navigation dans l'application.
/// </summary>
[Inject] [Inject]
public NavigationManager NavigationManager { get; set; } public NavigationManager NavigationManager { get; set; }
/// <summary>
/// Service pour la localisation des ressources (traductions) sur la page.
/// </summary>
[Inject] [Inject]
public IStringLocalizer<Accueil> Localizer { get; set; } public IStringLocalizer<Accueil> Localizer { get; set; }
/// <summary>
/// Méthode appelée lors de l'initialisation du composant.
/// Elle charge les citations quotidiennes depuis un fichier JSON.
/// </summary>
/// <returns>Une tâche représentant l'opération asynchrone.</returns>
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
// Chargement des citations quotidiennes depuis le fichier JSON
Dailyquote = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataDailyQuote.json"); Dailyquote = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataDailyQuote.json");
} }
} }
} }

@ -3,7 +3,7 @@ using WF_WebAdmin.Service;
using WF_WebAdmin.Model; using WF_WebAdmin.Model;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
@ -17,12 +17,16 @@ namespace WF_WebAdmin.Pages
private QuizModel QuizModel = new(); private QuizModel QuizModel = new();
/// <summary>
/// Handles the form submission to create a new quiz.
/// </summary>
private async void HandleValidSubmit() private async void HandleValidSubmit()
{ {
int id; int id;
id = await quizService.getNbQuiz(); id = await quizService.getNbQuiz(); // Fetch the current quiz count
id++; id++; // Increment the quiz ID to create a new quiz ID
// Create and add the quiz using the validated inputs
await quizService.addQuiz(new Quiz( await quizService.addQuiz(new Quiz(
id, id,
validateInformation(QuizModel.Question), validateInformation(QuizModel.Question),
@ -32,48 +36,56 @@ namespace WF_WebAdmin.Pages
validateInformation(QuizModel.AnswerD), validateInformation(QuizModel.AnswerD),
validateReponse(QuizModel.CAnswer) validateReponse(QuizModel.CAnswer)
)); ));
// Navigate to the quiz management page after adding the quiz
NavigationManager.NavigateTo("modifquiz"); NavigationManager.NavigateTo("modifquiz");
} }
/// <summary>
/// Handles the change in the correct answer selection.
/// </summary>
private void OnCAwnserChange(string item, object checkedValue) private void OnCAwnserChange(string item, object checkedValue)
{ {
QuizModel.CAnswer = item; QuizModel.CAnswer = item;
} }
/// <summary>
/// Validates each input (question or answers) to ensure it isn't null or empty.
/// </summary>
private static string validateInformation(string item) private static string validateInformation(string item)
{ {
return item; // VALIDATION A FAIRE if (string.IsNullOrWhiteSpace(item))
{
throw new ArgumentException("Input cannot be empty or whitespace.");
}
return item; // Return the valid input
} }
/// <summary>
/// Validates the selected correct answer to be one of the valid options (A, B, C, D).
/// </summary>
private static string validateReponse(string item) private static string validateReponse(string item)
{ {
try try
{ {
if (!string.IsNullOrEmpty(item)) if (string.IsNullOrEmpty(item))
{ {
switch (item) throw new ArgumentNullException("Correct answer must be selected.");
{
case "A":
break;
case "B":
break;
case "C":
break;
case "D":
break;
default:
throw new InvalidDataException("Invalid item (validateReponse) : item must be A,B,C or D " + item + "give.");
}
} }
else
// Ensure the answer is one of A, B, C, or D
if (!Regex.IsMatch(item, "^[A-D]$"))
{ {
throw new ArgumentNullException("Invalid item (validateReponse): null given."); throw new InvalidDataException($"Invalid answer choice: '{item}'. Answer must be one of A, B, C, or D.");
} }
return item;
return item; // Return the valid answer
} }
catch (Exception ex) catch (Exception ex)
{ {
return "A"; //Default Argument // Log error or show a message to the user
Console.WriteLine(ex.Message);
return "A"; // Return default answer "A" if validation fails
} }
} }
} }

@ -1,6 +1,5 @@
using Blazorise.DataGrid; using Blazorise.DataGrid;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration.UserSecrets;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using System.Collections.Generic; using System.Collections.Generic;
using WF_WebAdmin.Model; using WF_WebAdmin.Model;
@ -8,21 +7,65 @@ using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Page permettant de gérer les utilisateurs, y compris la suppression, la modification, et l'attribution du rôle admin.
/// </summary>
public partial class DeleteUser public partial class DeleteUser
{ {
/// <summary>
/// Indicateur pour afficher ou non la popup de confirmation de suppression.
/// </summary>
private bool showDeletePopup = false; private bool showDeletePopup = false;
/// <summary>
/// Indicateur pour afficher ou non la popup de confirmation de modification d'utilisateur.
/// </summary>
private bool showModifyPopup = false; private bool showModifyPopup = false;
/// <summary>
/// Liste des utilisateurs à afficher dans la page.
/// </summary>
private List<User> users; private List<User> users;
/// <summary>
/// Utilisateur sélectionné pour la suppression.
/// </summary>
private User userToDelete = null; private User userToDelete = null;
/// <summary>
/// Utilisateur sélectionné pour la modification.
/// </summary>
private User selectedUser; private User selectedUser;
/// <summary>
/// Indicateur pour afficher ou non la popup de confirmation de suppression.
/// </summary>
private bool showPopupDelete = false; private bool showPopupDelete = false;
/// <summary>
/// Indicateur pour afficher ou non la popup de confirmation de l'attribution du rôle admin.
/// </summary>
private bool showPopupAdmin = false; private bool showPopupAdmin = false;
/// <summary>
/// Utilisateur sélectionné pour devenir administrateur.
/// </summary>
private User userToAdmin = null; private User userToAdmin = null;
/// <summary>
/// Nombre maximum d'utilisateurs à afficher par page.
/// </summary>
private int MaxValue = 5; private int MaxValue = 5;
/// <summary>
/// Nombre total d'utilisateurs dans la base de données.
/// </summary>
private int totalItem; private int totalItem;
private int page = 1;
/// <summary>
/// Numéro de la page actuelle dans le DataGrid.
/// </summary>
private int page = 1;
[Inject] [Inject]
public HttpClient Http { get; set; } public HttpClient Http { get; set; }
@ -30,19 +73,30 @@ namespace WF_WebAdmin.Pages
[Inject] [Inject]
public NavigationManager NavigationManager { get; set; } public NavigationManager NavigationManager { get; set; }
/// <summary>
/// Service permettant de gérer les utilisateurs (CRUD).
/// </summary>
[Inject] [Inject]
private IUserService userService { get; set; } private IUserService userService { get; set; }
/// <summary>
/// Localisateur de chaîne pour gérer la localisation de la page.
/// </summary>
[Inject] [Inject]
public IStringLocalizer<DeleteUser> Localizer { get; set; } public IStringLocalizer<DeleteUser> Localizer { get; set; }
/// <summary>
/// Méthode appelée lors de l'initialisation de la page. Charge les utilisateurs à afficher.
/// </summary>
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
// Charge la première page des utilisateurs
users = await userService.getSomeUser(MaxValue, 1); users = await userService.getSomeUser(MaxValue, 1);
} }
/// <summary>
/// Méthode appelée lors de la lecture des données dans le DataGrid. Gère la pagination et l'affichage des utilisateurs.
/// </summary>
private async Task OnReadData(DataGridReadDataEventArgs<User> e) private async Task OnReadData(DataGridReadDataEventArgs<User> e)
{ {
if (e.CancellationToken.IsCancellationRequested) if (e.CancellationToken.IsCancellationRequested)
@ -50,48 +104,62 @@ namespace WF_WebAdmin.Pages
return; return;
} }
// Récupère les utilisateurs pour la page demandée
var response = await userService.getSomeUser(e.PageSize, e.Page); var response = await userService.getSomeUser(e.PageSize, e.Page);
if (!e.CancellationToken.IsCancellationRequested) if (!e.CancellationToken.IsCancellationRequested)
{ {
totalItem = await userService.getNbUser(); totalItem = await userService.getNbUser(); // Récupère le nombre total d'utilisateurs
users = new List<User>(response.ToArray()); users = new List<User>(response.ToArray()); // Met à jour la liste des utilisateurs
page = e.Page; page = e.Page; // Met à jour le numéro de la page
} }
} }
// ------- Popup remove user ------- // ------- Popup remove user -------
/// <summary>
/// Affiche la popup de confirmation de suppression de l'utilisateur sélectionné.
/// </summary>
private void ShowConfirmation(User user) private void ShowConfirmation(User user)
{ {
userToDelete = user; userToDelete = user;
showPopupDelete = true; showPopupDelete = true;
} }
/// <summary>
/// Affiche la popup de modification de l'utilisateur sélectionné.
/// </summary>
private void ShowModifyConfirmation(User user) private void ShowModifyConfirmation(User user)
{ {
// Afficher la modale et mémoriser l'utilisateur à supprimer
selectedUser = user; selectedUser = user;
showModifyPopup = true; showModifyPopup = true;
} }
/// <summary>
/// Supprime l'utilisateur sélectionné et met à jour la liste des utilisateurs affichés.
/// </summary>
private async Task RemoveUser() private async Task RemoveUser()
{ {
if (userToDelete != null) if (userToDelete != null)
{ {
await userService.removeUser(userToDelete); await userService.removeUser(userToDelete); // Appelle le service pour supprimer l'utilisateur
ClosePopup(); ClosePopup(); // Ferme les popups
var response = await userService.getSomeUser(MaxValue, page); var response = await userService.getSomeUser(MaxValue, page); // Récupère à nouveau les utilisateurs
users = new List<User>(response.ToArray()); users = new List<User>(response.ToArray()); // Met à jour la liste des utilisateurs
} }
} }
/// <summary>
/// Met à jour l'utilisateur sélectionné.
/// </summary>
private async Task ModifyUser() private async Task ModifyUser()
{ {
await userService.updateUser(selectedUser); await userService.updateUser(selectedUser); // Appelle le service pour mettre à jour l'utilisateur
ClosePopup(); ClosePopup(); // Ferme les popups
} }
/// <summary>
/// Ferme toutes les popups actuellement ouvertes.
/// </summary>
private void ClosePopup() private void ClosePopup()
{ {
showDeletePopup = false; showDeletePopup = false;
@ -100,31 +168,33 @@ namespace WF_WebAdmin.Pages
showPopupAdmin = false; showPopupAdmin = false;
} }
// ------- Popup admin ------- // ------- Popup admin -------
/// <summary>
/// Affiche la popup de confirmation pour attribuer ou révoquer le rôle d'administrateur.
/// </summary>
private void ShowConfirmationAdmin(User user) private void ShowConfirmationAdmin(User user)
{ {
userToAdmin = user; userToAdmin = user;
showPopupAdmin = true; showPopupAdmin = true;
} }
/// <summary>
/// Attribue ou révoque le rôle d'administrateur pour l'utilisateur sélectionné.
/// </summary>
private async Task setAdmin() private async Task setAdmin()
{ {
if (!userToAdmin.IsAdmin) if (!userToAdmin.IsAdmin) // Si l'utilisateur n'est pas administrateur, on l'attribue comme admin
{ {
userToAdmin.IsAdmin = true; userToAdmin.IsAdmin = true;
await userService.updateUser(userToAdmin); await userService.updateUser(userToAdmin); // Met à jour l'utilisateur
ClosePopup(); ClosePopup(); // Ferme les popups
} }
else else // Si l'utilisateur est déjà administrateur, on révoque ce rôle
{ {
userToAdmin.IsAdmin = false; userToAdmin.IsAdmin = false;
await userService.updateUser(userToAdmin); await userService.updateUser(userToAdmin); // Met à jour l'utilisateur
ClosePopup(); ClosePopup(); // Ferme les popups
} }
} }
} }
} }

@ -4,28 +4,59 @@ using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Page permettant de modifier une citation existante.
/// </summary>
public partial class Edit public partial class Edit
{ {
/// <summary>
/// Identifiant de la citation à éditer passé en paramètre de la route.
/// </summary>
[Parameter] [Parameter]
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Service pour gérer les citations.
/// </summary>
[Inject] [Inject]
private IQuoteService quoteService { get; set; } private IQuoteService quoteService { get; set; }
/// <summary>
/// Service pour la navigation entre les pages.
/// </summary>
[Inject] [Inject]
public NavigationManager NavigationManager { get; set; } public NavigationManager NavigationManager { get; set; }
private Quote q{ get; set; } /// <summary>
/// Citation actuelle à éditer.
/// </summary>
private Quote q { get; set; }
/// <summary>
/// Modèle de données pour l'édition de la citation.
/// </summary>
private QuoteModel quoteModel = new(); private QuoteModel quoteModel = new();
/// <summary>
/// Liste des personnages disponibles pour l'édition.
/// </summary>
private List<Character> charac = new List<Character>(); private List<Character> charac = new List<Character>();
/// <summary>
/// Liste des sources disponibles pour l'édition.
/// </summary>
private List<Source> src = new List<Source>(); private List<Source> src = new List<Source>();
/// <summary>
/// Méthode appelée lors de l'initialisation de la page.
/// Elle charge la citation à éditer ainsi que les données associées (personnages, sources).
/// </summary>
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
// Récupère la citation à éditer à partir de l'ID
q = await quoteService.getOnequote(Id); q = await quoteService.getOnequote(Id);
// Initialise le modèle de données avec les informations de la citation
quoteModel.Content = q.Content; quoteModel.Content = q.Content;
quoteModel.Langue = q.Langue; quoteModel.Langue = q.Langue;
quoteModel.Charac = q.Charac; quoteModel.Charac = q.Charac;
@ -36,30 +67,43 @@ namespace WF_WebAdmin.Pages
quoteModel.DateSrc = q.DateSrc; quoteModel.DateSrc = q.DateSrc;
quoteModel.UserProposition = q.UserProposition; quoteModel.UserProposition = q.UserProposition;
quoteModel.IsValid = q.IsValid; quoteModel.IsValid = q.IsValid;
// Charge la liste des personnages et des sources
charac = await quoteService.getChar(); charac = await quoteService.getChar();
src = await quoteService.getSrc(); src = await quoteService.getSrc();
} }
/// <summary>
/// Méthode appelée lors de la soumission valide du formulaire d'édition.
/// Elle met à jour la citation avec les nouvelles données.
/// </summary>
protected async void HandleValidSubmit() protected async void HandleValidSubmit()
{ {
// Met à jour les informations de la citation
q.Content = quoteModel.Content; q.Content = quoteModel.Content;
q.Langue = quoteModel.Langue; q.Langue = quoteModel.Langue;
q.TitleSrc = quoteModel.TitleSrc; q.TitleSrc = quoteModel.TitleSrc;
q.Charac = quoteModel.Charac; q.Charac = quoteModel.Charac;
// Appelle le service pour mettre à jour la citation dans la base de données
await quoteService.updateQuote(q); await quoteService.updateQuote(q);
// Redirige vers la page des citations à modifier
NavigationManager.NavigateTo("modifquote"); NavigationManager.NavigateTo("modifquote");
} }
/// <summary>
/// Méthode appelée lors du changement de langue dans le formulaire.
/// </summary>
/// <param name="item">Langue sélectionnée.</param>
/// <param name="checkedValue">Valeur de l'élément vérifié.</param>
private void OnlangChange(string item, object checkedValue) private void OnlangChange(string item, object checkedValue)
{ {
if(item == "fr" || item == "en") // Si la langue est "fr" ou "en", met à jour la langue dans le modèle de données
if (item == "fr" || item == "en")
{ {
quoteModel.Langue = item; quoteModel.Langue = item;
} }
} }
} }
} }

@ -4,23 +4,41 @@ using System.Diagnostics;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Modèle de page Razor pour afficher les erreurs dans l'application.
/// </summary>
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
[IgnoreAntiforgeryToken] [IgnoreAntiforgeryToken]
public class ErrorModel : PageModel public class ErrorModel : PageModel
{ {
/// <summary>
/// Identifiant unique de la requête pour le suivi des erreurs.
/// </summary>
public string? RequestId { get; set; } public string? RequestId { get; set; }
/// <summary>
/// Indicateur pour afficher l'ID de la requête si ce dernier est disponible.
/// </summary>
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
private readonly ILogger<ErrorModel> _logger; private readonly ILogger<ErrorModel> _logger;
/// <summary>
/// Constructeur pour initialiser le modèle de page avec le service de journalisation.
/// </summary>
/// <param name="logger">Service de journalisation pour capturer les erreurs.</param>
public ErrorModel(ILogger<ErrorModel> logger) public ErrorModel(ILogger<ErrorModel> logger)
{ {
_logger = logger; _logger = logger;
} }
/// <summary>
/// Méthode appelée lors de l'accès à la page d'erreur.
/// Elle enregistre l'ID de la requête pour la journalisation et l'affichage des erreurs.
/// </summary>
public void OnGet() public void OnGet()
{ {
// Capture de l'ID de la requête à partir de l'activité en cours ou du trace identifier
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
} }
} }

@ -1,70 +1,101 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration.UserSecrets;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using WF_WebAdmin.Model; using WF_WebAdmin.Model;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Composant Blazor pour la gestion de la connexion des utilisateurs.
/// </summary>
public partial class Login public partial class Login
{ {
/// <summary>
/// Service de localisation pour gérer les textes multilingues dans la page de connexion.
/// </summary>
[Inject] [Inject]
public IStringLocalizer<Login> Localizer { get; set; } public IStringLocalizer<Login> Localizer { get; set; }
/// <summary>
/// Objet représentant les informations de connexion de l'utilisateur.
/// </summary>
private UserLogin userLogin = new UserLogin(); private UserLogin userLogin = new UserLogin();
/// <summary>
/// Objet représentant l'utilisateur connecté.
/// </summary>
[Inject] [Inject]
public UserLogin uLogin { get; set; } public UserLogin uLogin { get; set; }
/// <summary>
/// Message d'erreur affiché en cas de connexion échouée.
/// </summary>
private string ErrorConnexion; private string ErrorConnexion;
/// <summary>
/// Liste des utilisateurs enregistrés pour la connexion.
/// </summary>
private List<UserLogin> usersConnexion; private List<UserLogin> usersConnexion;
/// <summary>
/// Service HTTP pour effectuer des requêtes.
/// </summary>
[Inject] [Inject]
public HttpClient Http { get; set; } public HttpClient Http { get; set; }
/// <summary>
/// Service de gestion de la navigation dans l'application Blazor.
/// </summary>
[Inject] [Inject]
public NavigationManager NavigationManager { get; set; } public NavigationManager NavigationManager { get; set; }
/// <summary>
/// Méthode appelée lors de l'initialisation du composant pour charger les données des utilisateurs.
/// </summary>
/// <returns>Une tâche asynchrone représentant l'initialisation du composant.</returns>
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
// Chargement des utilisateurs depuis un fichier JSON simulé.
usersConnexion = await Http.GetFromJsonAsync<List<UserLogin>>($"{NavigationManager.BaseUri}fake-dataUserLogin.json"); usersConnexion = await Http.GetFromJsonAsync<List<UserLogin>>($"{NavigationManager.BaseUri}fake-dataUserLogin.json");
} }
/// <summary>
/// Méthode pour valider les informations de connexion de l'utilisateur.
/// </summary>
public void validlogin() public void validlogin()
{ {
// Vérification si les informations de connexion sont renseignées
if (!string.IsNullOrEmpty(userLogin.Name) || !string.IsNullOrEmpty(userLogin.Mdp)) if (!string.IsNullOrEmpty(userLogin.Name) || !string.IsNullOrEmpty(userLogin.Mdp))
{ {
foreach (var user in usersConnexion) foreach (var user in usersConnexion)
{ {
if(userLogin.Name == user.Name && userLogin.Mdp == user.Mdp) // Vérification si les identifiants correspondent
if (userLogin.Name == user.Name && userLogin.Mdp == user.Mdp)
{ {
if(user.IsAdmin) // Vérification si l'utilisateur est un administrateur
if (user.IsAdmin)
{ {
// Assignation de l'utilisateur à la session
uLogin.Id = userLogin.Id; uLogin.Id = userLogin.Id;
uLogin.Name = user.Name; uLogin.Name = user.Name;
uLogin.Image = user.Image; uLogin.Image = user.Image;
// Redirection vers la page d'accueil
NavigationManager.NavigateTo(NavigationManager.BaseUri + "accueil"); NavigationManager.NavigateTo(NavigationManager.BaseUri + "accueil");
return; return;
} }
else else
{ {
// Message d'erreur pour utilisateur non admin
ErrorConnexion = "Connexion échouée, le nom ou le mot de passe sont incorrectes"; ErrorConnexion = "Connexion échouée, le nom ou le mot de passe sont incorrectes";
} }
} }
else else
{ {
// Message d'erreur pour informations invalides
ErrorConnexion = "Connexion échouée, le nom ou le mot de passe sont incorrectes"; ErrorConnexion = "Connexion échouée, le nom ou le mot de passe sont incorrectes";
} }
} }
} }
} }
} }
} }

@ -5,25 +5,56 @@ using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Composant Blazor pour la gestion des quiz, permettant leur modification et suppression.
/// </summary>
public partial class ModifQuiz public partial class ModifQuiz
{ {
/// <summary>
/// Liste des quiz à afficher dans le tableau.
/// </summary>
private Quiz[] quiz; private Quiz[] quiz;
/// <summary>
/// Valeur maximale d'éléments par page.
/// </summary>
private int MaxValue = 5; private int MaxValue = 5;
/// <summary>
/// Nombre total d'éléments dans la liste des quiz.
/// </summary>
private int totalItem; private int totalItem;
/// <summary>
/// Indicateur de l'affichage de la popup de modification du quiz.
/// </summary>
private bool showEditQuiz = false; private bool showEditQuiz = false;
/// <summary>
/// Quiz actuellement sélectionné pour modification.
/// </summary>
private Quiz? selectedQuiz; private Quiz? selectedQuiz;
/// <summary>
/// Indicateur de l'affichage de la popup de suppression.
/// </summary>
private bool showPopupDelete = false; private bool showPopupDelete = false;
/// <summary>
/// Numéro de la page actuellement affichée.
/// </summary>
private int page = 1; private int page = 1;
/// <summary>
/// Service pour gérer les quiz injecté.
/// </summary>
[Inject] [Inject]
public IQuizService QuizService { get; set; } public IQuizService QuizService { get; set; }
/// <summary>
/// Méthode appelée pour récupérer les données de la page actuelle dans le tableau.
/// </summary>
/// <param name="e">Arguments de lecture de données pour le DataGrid.</param>
private async Task OnReadData(DataGridReadDataEventArgs<Quiz> e) private async Task OnReadData(DataGridReadDataEventArgs<Quiz> e)
{ {
if (e.CancellationToken.IsCancellationRequested) if (e.CancellationToken.IsCancellationRequested)
@ -41,6 +72,10 @@ namespace WF_WebAdmin.Pages
} }
} }
/// <summary>
/// Méthode pour afficher la popup de modification d'un quiz.
/// </summary>
/// <param name="quiz">Quiz à modifier.</param>
private void OnEditButtonClicked(Quiz quiz) private void OnEditButtonClicked(Quiz quiz)
{ {
if (quiz == null) return; if (quiz == null) return;
@ -48,6 +83,9 @@ namespace WF_WebAdmin.Pages
showEditQuiz = true; showEditQuiz = true;
} }
/// <summary>
/// Méthode pour fermer la popup (modification ou suppression).
/// </summary>
private void ClosePopup() private void ClosePopup()
{ {
showEditQuiz = false; showEditQuiz = false;
@ -55,19 +93,32 @@ namespace WF_WebAdmin.Pages
selectedQuiz = null; selectedQuiz = null;
} }
/// <summary>
/// Méthode pour modifier un quiz sélectionné.
/// </summary>
private async Task EditQuiz() private async Task EditQuiz()
{ {
await QuizService.updateQuiz(selectedQuiz); if (selectedQuiz != null)
selectedQuiz = null; {
ClosePopup(); await QuizService.updateQuiz(selectedQuiz);
selectedQuiz = null;
ClosePopup();
}
} }
/// <summary>
/// Méthode pour afficher la popup de suppression d'un quiz.
/// </summary>
/// <param name="q">Quiz à supprimer.</param>
private void OnDelete(Quiz q) private void OnDelete(Quiz q)
{ {
selectedQuiz = q; selectedQuiz = q;
showPopupDelete = true; showPopupDelete = true;
} }
/// <summary>
/// Méthode pour supprimer un quiz sélectionné.
/// </summary>
private async void RemoveQuote() private async void RemoveQuote()
{ {
if (selectedQuiz != null) if (selectedQuiz != null)
@ -77,7 +128,7 @@ namespace WF_WebAdmin.Pages
var response = await QuizService.getSommeQuiz(MaxValue, page); var response = await QuizService.getSommeQuiz(MaxValue, page);
quiz = response.ToArray(); quiz = response.ToArray();
} }
showPopupDelete= false; showPopupDelete = false;
} }
} }
} }

@ -5,25 +5,51 @@ using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Composant Blazor pour la gestion des citations, permettant la modification et la suppression de celles-ci.
/// </summary>
public partial class ModifQuote public partial class ModifQuote
{ {
/// <summary>
/// Liste des citations à afficher dans le tableau.
/// </summary>
private Quote[] quotes; private Quote[] quotes;
/// <summary>
/// Valeur maximale d'éléments par page.
/// </summary>
private int MaxValue = 5; private int MaxValue = 5;
/// <summary>
/// Nombre total d'éléments dans la liste des citations.
/// </summary>
private int totalItem; private int totalItem;
/*private bool showEditQuote = false;*/ /// <summary>
/// Citation actuellement sélectionnée pour modification.
/// </summary>
private Quote? selectedQuote; private Quote? selectedQuote;
/// <summary>
/// Indicateur de l'affichage de la popup de suppression.
/// </summary>
private bool showPopupDelete = false; private bool showPopupDelete = false;
/// <summary>
/// Numéro de la page actuellement affichée.
/// </summary>
private int page = 1; private int page = 1;
/// <summary>
/// Service pour gérer les citations injecté.
/// </summary>
[Inject] [Inject]
public IQuoteService QuoteService { get; set; } public IQuoteService QuoteService { get; set; }
/// <summary>
/// Méthode appelée pour récupérer les données de la page actuelle dans le tableau.
/// </summary>
/// <param name="e">Arguments de lecture de données pour le DataGrid.</param>
private async Task OnReadData(DataGridReadDataEventArgs<Quote> e) private async Task OnReadData(DataGridReadDataEventArgs<Quote> e)
{ {
if (e.CancellationToken.IsCancellationRequested) if (e.CancellationToken.IsCancellationRequested)
@ -41,33 +67,28 @@ namespace WF_WebAdmin.Pages
} }
} }
/*private void OnEditButtonClicked(Quote quote) /// <summary>
{ /// Méthode pour fermer la popup (modification ou suppression).
if (selectedQuote == null) return; /// </summary>
selectedQuote = quote;
showEditQuote = true;
}*/
private void ClosePopup() private void ClosePopup()
{ {
/*showEditQuote = false;*/
showPopupDelete = false; showPopupDelete = false;
selectedQuote = null; selectedQuote = null;
} }
/*private async Task EditQuote() /// <summary>
{ /// Méthode appelée pour afficher la popup de suppression d'une citation.
await QuoteService.updateQuote(selectedQuote); /// </summary>
selectedQuote = null; /// <param name="q">Citation à supprimer.</param>
ClosePopup();
}*/
private void OnDelete(Quote q) private void OnDelete(Quote q)
{ {
selectedQuote = q; selectedQuote = q;
showPopupDelete = true; showPopupDelete = true;
} }
/// <summary>
/// Méthode pour supprimer une citation sélectionnée.
/// </summary>
private async void RemoveQuote() private async void RemoveQuote()
{ {
if (selectedQuote != null) if (selectedQuote != null)

@ -5,30 +5,55 @@ using WF_WebAdmin.Service;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Composant Blazor pour gérer la validation des quiz.
/// </summary>
public partial class ValidQuiz public partial class ValidQuiz
{ {
/// <summary>
/// Liste des quiz à valider.
/// </summary>
private List<Quiz> quizzes; private List<Quiz> quizzes;
/// <summary>
/// Client HTTP injecté pour effectuer des requêtes API.
/// </summary>
[Inject] [Inject]
public HttpClient Http { get; set; } public HttpClient Http { get; set; }
/// <summary>
/// Gestionnaire de navigation injecté pour gérer les URL.
/// </summary>
[Inject] [Inject]
public NavigationManager NavigationManager { get; set; } public NavigationManager NavigationManager { get; set; }
/// <summary>
/// Service pour gérer les quiz injecté.
/// </summary>
[Inject] [Inject]
public IQuizService QuizService { get; set; } public IQuizService QuizService { get; set; }
/// <summary>
/// Méthode appelée lors de l'initialisation du composant. Charge la liste des quiz à valider.
/// </summary>
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
quizzes = await QuizService.getQuizzesToValidate(); quizzes = await QuizService.getQuizzesToValidate();
} }
/// <summary>
/// Méthode appelée lorsqu'on clique sur le bouton de validation d'un quiz.
/// </summary>
/// <param name="quiz">Le quiz à valider.</param>
private void OnValidButton(Quiz quiz) private void OnValidButton(Quiz quiz)
{ {
ValidateQuiz(quiz); ValidateQuiz(quiz);
} }
/// <summary>
/// Valide un quiz en mettant à jour son état.
/// </summary>
/// <param name="quiz">Le quiz à valider.</param>
private void ValidateQuiz(Quiz quiz) private void ValidateQuiz(Quiz quiz)
{ {
Console.WriteLine($"Quiz {quiz.Id} validated!"); Console.WriteLine($"Quiz {quiz.Id} validated!");
@ -40,11 +65,19 @@ namespace WF_WebAdmin.Pages
QuizService.updateQuiz(quiz); QuizService.updateQuiz(quiz);
} }
/// <summary>
/// Méthode appelée lorsqu'on clique sur le bouton de rejet d'un quiz.
/// </summary>
/// <param name="quiz">Le quiz à rejeter.</param>
private void OnRejectButton(Quiz quiz) private void OnRejectButton(Quiz quiz)
{ {
RejectQuiz(quiz); RejectQuiz(quiz);
} }
/// <summary>
/// Rejette un quiz en supprimant son état de validation.
/// </summary>
/// <param name="quiz">Le quiz à rejeter.</param>
private void RejectQuiz(Quiz quiz) private void RejectQuiz(Quiz quiz)
{ {
Console.WriteLine($"Quiz {quiz.Id} rejected!"); Console.WriteLine($"Quiz {quiz.Id} rejected!");

@ -9,16 +9,31 @@ using System.Linq;
namespace WF_WebAdmin.Pages namespace WF_WebAdmin.Pages
{ {
/// <summary>
/// Composant Blazor pour afficher et valider des citations.
/// </summary>
public partial class ValidQuote public partial class ValidQuote
{ {
/// <summary>
/// Tableau contenant les citations à valider.
/// </summary>
private Quote[] quotes; private Quote[] quotes;
/// <summary>
/// Client HTTP injecté pour effectuer des requêtes API.
/// </summary>
[Inject] [Inject]
public HttpClient Http { get; set; } public HttpClient Http { get; set; }
/// <summary>
/// Gestionnaire de navigation injecté pour gérer les URL.
/// </summary>
[Inject] [Inject]
public NavigationManager NavigationManager { get; set; } public NavigationManager NavigationManager { get; set; }
/// <summary>
/// Méthode appelée à l'initialisation du composant pour charger les citations.
/// </summary>
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
quotes = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataQuote.json"); quotes = await Http.GetFromJsonAsync<Quote[]>($"{NavigationManager.BaseUri}fake-dataQuote.json");

@ -2,25 +2,66 @@ using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service namespace WF_WebAdmin.Service
{ {
/// <summary>
/// Interface définissant les opérations de gestion des quiz.
/// </summary>
public interface IQuizService public interface IQuizService
{ {
/// <summary>
/// Ajoute un quiz.
/// </summary>
/// <param name="quiz">Quiz à ajouter.</param>
public Task addQuiz(Quiz quiz); public Task addQuiz(Quiz quiz);
/// <summary>
/// Met à jour un quiz existant.
/// </summary>
/// <param name="quiz">Quiz à mettre à jour.</param>
public Task updateQuiz(Quiz quiz); public Task updateQuiz(Quiz quiz);
/// <summary>
/// Supprime un quiz par son identifiant.
/// </summary>
/// <param name="id">Identifiant du quiz à supprimer.</param>
public Task removeQuiz(int id); public Task removeQuiz(int id);
/// <summary>
/// Valide un quiz par son identifiant.
/// </summary>
/// <param name="id">Identifiant du quiz à valider.</param>
public Task validateQuiz(int id); public Task validateQuiz(int id);
/// <summary>
/// Récupère la liste de tous les quiz.
/// </summary>
/// <returns>Liste de tous les quiz.</returns>
public Task<List<Quiz>> getQuizzes(); public Task<List<Quiz>> getQuizzes();
/// <summary>
/// Récupère la liste des quiz en attente de validation.
/// </summary>
/// <returns>Liste des quiz non validés.</returns>
public Task<List<Quiz>> getQuizzesToValidate(); public Task<List<Quiz>> getQuizzesToValidate();
/// <summary>
/// Récupère un quiz spécifique par son identifiant.
/// </summary>
/// <param name="id">Identifiant du quiz.</param>
/// <returns>Le quiz correspondant ou null s'il n'existe pas.</returns>
public Task<Quiz> getQuiz(int id); public Task<Quiz> getQuiz(int id);
/// <summary>
/// Récupère une liste paginée de quiz.
/// </summary>
/// <param name="nb">Nombre de quiz par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Liste des quiz correspondant à la pagination.</returns>
public Task<List<Quiz>> getSommeQuiz(int nb, int page); public Task<List<Quiz>> getSommeQuiz(int nb, int page);
/// <summary>
/// Récupère le nombre total de quiz enregistrés.
/// </summary>
/// <returns>Nombre total de quiz.</returns>
public Task<int> getNbQuiz(); public Task<int> getNbQuiz();
} }
} }

@ -2,32 +2,94 @@
namespace WF_WebAdmin.Service namespace WF_WebAdmin.Service
{ {
/// <summary>
/// Interface définissant les opérations de gestion des citations.
/// </summary>
public interface IQuoteService public interface IQuoteService
{ {
/// <summary>
/// Ajoute une citation.
/// </summary>
/// <param name="quote">Citation à ajouter.</param>
public Task addQuote(Quote quote); public Task addQuote(Quote quote);
/// <summary>
/// Supprime une citation.
/// </summary>
/// <param name="quote">Citation à supprimer.</param>
public Task removeQuote(Quote quote); public Task removeQuote(Quote quote);
/// <summary>
/// Valide une citation.
/// </summary>
/// <param name="quote">Citation à valider.</param>
public Task validQuote(Quote quote); public Task validQuote(Quote quote);
/// <summary>
/// Met à jour une citation existante.
/// </summary>
/// <param name="quote">Citation à mettre à jour.</param>
public Task updateQuote(Quote quote); public Task updateQuote(Quote quote);
/// <summary>
/// Récupère toutes les citations.
/// </summary>
/// <returns>Liste de toutes les citations.</returns>
public Task<List<Quote>> getAllQuote(); public Task<List<Quote>> getAllQuote();
/// <summary>
/// Récupère une liste paginée de citations.
/// </summary>
/// <param name="nb">Nombre de citations par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Liste des citations correspondant à la pagination.</returns>
public Task<List<Quote>> getSomeQuote(int nb, int page); public Task<List<Quote>> getSomeQuote(int nb, int page);
/// <summary>
/// Récupère une citation spécifique par son identifiant.
/// </summary>
/// <param name="id">Identifiant de la citation.</param>
/// <returns>La citation correspondante ou null si elle n'existe pas.</returns>
public Task<Quote> getOnequote(int id); public Task<Quote> getOnequote(int id);
/// <summary>
/// Recherche des citations en fonction d'un critère.
/// </summary>
/// <param name="reserch">Terme de recherche.</param>
/// <param name="argument">Liste des arguments pour affiner la recherche.</param>
/// <returns>Liste des citations correspondant aux critères.</returns>
public Task<List<Quote>> reserchQuote(string reserch, List<string> argument); public Task<List<Quote>> reserchQuote(string reserch, List<string> argument);
/// <summary>
/// Récupère toutes les citations non validées.
/// </summary>
/// <returns>Liste des citations non validées.</returns>
public Task<List<Quote>> getAllQuoteInvalid(); public Task<List<Quote>> getAllQuoteInvalid();
/// <summary>
/// Récupère une liste paginée de citations non validées.
/// </summary>
/// <param name="nb">Nombre de citations par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Liste des citations non validées correspondant à la pagination.</returns>
public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page); public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page);
/// <summary>
/// Récupère le nombre total de citations enregistrées.
/// </summary>
/// <returns>Nombre total de citations.</returns>
public Task<int> getNbQuote(); public Task<int> getNbQuote();
/// <summary>
/// Récupère la liste des personnages associés aux citations.
/// </summary>
/// <returns>Liste des personnages.</returns>
public Task<List<Character>> getChar(); public Task<List<Character>> getChar();
/// <summary>
/// Récupère la liste des sources associées aux citations.
/// </summary>
/// <returns>Liste des sources.</returns>
public Task<List<Source>> getSrc(); public Task<List<Source>> getSrc();
} }
} }

@ -2,24 +2,68 @@
namespace WF_WebAdmin.Service namespace WF_WebAdmin.Service
{ {
/// <summary>
/// Interface définissant les opérations de gestion des utilisateurs.
/// </summary>
public interface IUserService public interface IUserService
{ {
/// <summary>
/// Supprime un utilisateur du système.
/// </summary>
/// <param name="user">Utilisateur à supprimer.</param>
public Task removeUser(User user); public Task removeUser(User user);
/// <summary>
/// Met à jour le rôle d'un utilisateur.
/// </summary>
/// <param name="user">Utilisateur dont le rôle doit être mis à jour.</param>
public Task updateRole(User user); public Task updateRole(User user);
/// <summary>
/// Rétrograde le rôle d'un utilisateur.
/// </summary>
/// <param name="user">Utilisateur à rétrograder.</param>
public Task downgradeRole(User user); public Task downgradeRole(User user);
/// <summary>
/// Met à jour les informations d'un utilisateur.
/// </summary>
/// <param name="user">Utilisateur à mettre à jour.</param>
public Task updateUser(User user); public Task updateUser(User user);
/// <summary>
/// Récupère la liste complète des utilisateurs.
/// </summary>
/// <returns>Liste des utilisateurs.</returns>
public Task<List<User>> getAllUser(); public Task<List<User>> getAllUser();
/// <summary>
/// Récupère une liste paginée d'utilisateurs.
/// </summary>
/// <param name="nb">Nombre d'utilisateurs par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Liste des utilisateurs correspondant à la pagination.</returns>
public Task<List<User>> getSomeUser(int nb, int page); public Task<List<User>> getSomeUser(int nb, int page);
/// <summary>
/// Récupère un utilisateur spécifique par son identifiant.
/// </summary>
/// <param name="id">Identifiant de l'utilisateur.</param>
/// <returns>L'utilisateur correspondant ou null s'il n'existe pas.</returns>
public Task<User> getOneUser(int id); public Task<User> getOneUser(int id);
/// <summary>
/// Recherche des utilisateurs en fonction d'un critère.
/// </summary>
/// <param name="reserch">Terme de recherche.</param>
/// <param name="args">Liste des arguments pour affiner la recherche.</param>
/// <returns>Liste des utilisateurs correspondant aux critères.</returns>
public Task<List<User>> reserchUsers(string reserch, List<string> args); public Task<List<User>> reserchUsers(string reserch, List<string> args);
/// <summary>
/// Récupère le nombre total d'utilisateurs enregistrés.
/// </summary>
/// <returns>Nombre total d'utilisateurs.</returns>
public Task<int> getNbUser(); public Task<int> getNbUser();
} }
} }

@ -1,106 +1,153 @@
using System.Text.Json; using System.Text.Json;
using WF_WebAdmin.Model; using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service; namespace WF_WebAdmin.Service
public class QuizServiceStub: IQuizService
{ {
private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake_data_quiz.json"); /// <summary>
/// Service de gestion des quiz utilisant un fichier JSON comme stockage de données.
public async Task saveQuizJson(List<Quiz> quizzes) /// </summary>
public class QuizServiceStub : IQuizService
{ {
var json = JsonSerializer.Serialize(quizzes, new JsonSerializerOptions { WriteIndented = true }); private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake_data_quiz.json");
await File.WriteAllTextAsync(_jsonFilePath, json);
}
public async Task addQuiz(Quiz quiz) /// <summary>
{ /// Sauvegarde la liste des quiz dans un fichier JSON.
var data = await getQuizzes(); /// </summary>
quiz.Id = data.Count > 0 ? data.Max(p => p.Id) + 1 : 1; /// <param name="quizzes">Liste des quiz à sauvegarder.</param>
data.Add(quiz); public async Task saveQuizJson(List<Quiz> quizzes)
await saveQuizJson(data); {
} var json = JsonSerializer.Serialize(quizzes, new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(_jsonFilePath, json);
}
public async Task updateQuiz(Quiz quiz) /// <summary>
{ /// Ajoute un quiz à la liste et le sauvegarde dans le fichier JSON.
var data = await getQuizzes(); /// </summary>
var existingQuiz = data.FirstOrDefault(q => q.Id == quiz.Id); /// <param name="quiz">Quiz à ajouter.</param>
if (existingQuiz != null) public async Task addQuiz(Quiz quiz)
{ {
existingQuiz.Question = quiz.Question; var data = await getQuizzes();
existingQuiz.AnswerA = quiz.AnswerA; quiz.Id = data.Count > 0 ? data.Max(p => p.Id) + 1 : 1;
existingQuiz.AnswerB = quiz.AnswerB; data.Add(quiz);
existingQuiz.AnswerC = quiz.AnswerC;
existingQuiz.AnswerD = quiz.AnswerD;
existingQuiz.CAnswer = quiz.CAnswer;
existingQuiz.IsValid = quiz.IsValid;
existingQuiz.UserProposition = quiz.UserProposition;
await saveQuizJson(data); await saveQuizJson(data);
} }
}
public async Task removeQuiz(int id) /// <summary>
{ /// Met à jour un quiz existant dans la liste et le sauvegarde.
var data = await getQuizzes(); /// </summary>
var quiz = data.FirstOrDefault(q => q.Id == id); /// <param name="quiz">Quiz mis à jour.</param>
if (quiz != null) public async Task updateQuiz(Quiz quiz)
{ {
data.Remove(quiz); var data = await getQuizzes();
await saveQuizJson(data); var existingQuiz = data.FirstOrDefault(q => q.Id == quiz.Id);
if (existingQuiz != null)
{
existingQuiz.Question = quiz.Question;
existingQuiz.AnswerA = quiz.AnswerA;
existingQuiz.AnswerB = quiz.AnswerB;
existingQuiz.AnswerC = quiz.AnswerC;
existingQuiz.AnswerD = quiz.AnswerD;
existingQuiz.CAnswer = quiz.CAnswer;
existingQuiz.IsValid = quiz.IsValid;
existingQuiz.UserProposition = quiz.UserProposition;
await saveQuizJson(data);
}
} }
}
public Task validateQuiz(int id) /// <summary>
{ /// Supprime un quiz de la liste et met à jour le fichier JSON.
throw new NotImplementedException(); /// </summary>
} /// <param name="id">Identifiant du quiz à supprimer.</param>
public async Task removeQuiz(int id)
{
var data = await getQuizzes();
var quiz = data.FirstOrDefault(q => q.Id == id);
if (quiz != null)
{
data.Remove(quiz);
await saveQuizJson(data);
}
}
public async Task<List<Quiz>> getQuizzes() /// <summary>
{ /// Valide un quiz (non implémenté).
if (!File.Exists(_jsonFilePath)) /// </summary>
/// <param name="id">Identifiant du quiz à valider.</param>
public Task validateQuiz(int id)
{ {
Console.Out.WriteLine($"{_jsonFilePath} not found"); throw new NotImplementedException();
return new List<Quiz>();
} }
var json = await File.ReadAllTextAsync(_jsonFilePath); /// <summary>
return JsonSerializer.Deserialize<List<Quiz>>(json) ?? new List<Quiz>(); /// Récupère la liste complète des quiz à partir du fichier JSON.
} /// </summary>
/// <returns>Liste des quiz.</returns>
public async Task<List<Quiz>> getQuizzes()
{
if (!File.Exists(_jsonFilePath))
{
Console.Out.WriteLine($"{_jsonFilePath} not found");
return new List<Quiz>();
}
public async Task<List<Quiz>> getQuizzesToValidate() var json = await File.ReadAllTextAsync(_jsonFilePath);
{ return JsonSerializer.Deserialize<List<Quiz>>(json) ?? new List<Quiz>();
var quizzes = await getQuizzes(); }
return quizzes.Where(quiz => quiz.IsValid == false).ToList();
}
public async Task<Quiz> getQuiz(int id) /// <summary>
{ /// Récupère la liste des quiz non validés.
var data = await getQuizzes(); /// </summary>
var q = data.FirstOrDefault(p => p.Id == id); /// <returns>Liste des quiz en attente de validation.</returns>
if (q != null) public async Task<List<Quiz>> getQuizzesToValidate()
{ {
return q; var quizzes = await getQuizzes();
return quizzes.Where(quiz => quiz.IsValid == false).ToList();
} }
return null;
}
public async Task<List<Quiz>> getSommeQuiz(int nb, int page) /// <summary>
{ /// Récupère un quiz spécifique par son identifiant.
var data = await getQuizzes(); /// </summary>
if ((page - 1) * nb + nb > data.Count()) /// <param name="id">Identifiant du quiz.</param>
/// <returns>Le quiz correspondant ou null s'il n'existe pas.</returns>
public async Task<Quiz> getQuiz(int id)
{ {
if(nb > data.Count()) var data = await getQuizzes();
var q = data.FirstOrDefault(p => p.Id == id);
if (q != null)
{ {
return data.GetRange(0, data.Count()-1); return q;
} }
return data.GetRange(data.Count() - nb, nb); return null;
} }
return data.GetRange((page - 1) * nb, nb);
}
public async Task<int> getNbQuiz() /// <summary>
{ /// Récupère une liste paginée de quiz.
var data = await getQuizzes(); /// </summary>
return data.Count; /// <param name="nb">Nombre de quiz par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Liste des quiz correspondant à la pagination.</returns>
public async Task<List<Quiz>> getSommeQuiz(int nb, int page)
{
var data = await getQuizzes();
if ((page - 1) * nb + nb > data.Count())
{
if (nb > data.Count())
{
return data.GetRange(0, data.Count() - 1);
}
return data.GetRange(data.Count() - nb, nb);
}
return data.GetRange((page - 1) * nb, nb);
}
/// <summary>
/// Récupère le nombre total de quiz enregistrés.
/// </summary>
/// <returns>Nombre total de quiz.</returns>
public async Task<int> getNbQuiz()
{
var data = await getQuizzes();
return data.Count;
}
} }
} }

@ -4,29 +4,30 @@ using Npgsql;
namespace WF_WebAdmin.Service namespace WF_WebAdmin.Service
{ {
public class QuoteServiceLocal: IQuoteService /// <summary>
/// Service de gestion des citations utilisant une base de données PostgreSQL.
/// </summary>
public class QuoteServiceLocal : IQuoteService
{ {
private readonly string? _connectionString = "Host=localhost;Port=5432;Username=loguichard3;Password=Reglisse15.;Database=dbloguichard3"; private readonly string? _connectionString = "Host=localhost;Port=5432;Username=loguichard3;Password=Reglisse15.;Database=dbloguichard3";
/// <summary>
/// Ajoute une nouvelle citation à la base de données PostgreSQL.
/// </summary>
/// <param name="quote">Citation à ajouter.</param>
/// <returns>Un objet <see cref="QuoteDTO"/> représentant la citation ajoutée.</returns>
public async Task<QuoteDTO> AddQuoteAsync(Quote quote) public async Task<QuoteDTO> AddQuoteAsync(Quote quote)
{ {
QuoteExtension extension = new QuoteExtension(); QuoteExtension extension = new QuoteExtension();
QuoteDTO quoteDTO = extension.QuoteToDTO(quote); QuoteDTO quoteDTO = extension.QuoteToDTO(quote);
// Utilisation de NpgsqlConnection pour PostgreSQL
using (var connection = new NpgsqlConnection(_connectionString)) using (var connection = new NpgsqlConnection(_connectionString))
{ {
// Définir la requête SQL d'insertion
var commandText = "INSERT INTO Quote (content, langue, reason, id_source, id_caracter, id_user_verif, img_path) " + var commandText = "INSERT INTO Quote (content, langue, reason, id_source, id_caracter, id_user_verif, img_path) " +
"VALUES (@content, @langue, @reason, @source, @character, @user, @img_path)"; "VALUES (@content, @langue, @reason, @source, @character, @user, @img_path)";
// Créer une commande Npgsql
var command = new NpgsqlCommand(commandText, connection); var command = new NpgsqlCommand(commandText, connection);
/* /*
// Ajouter des paramètres à la commande // Ajouter des paramètres à la commande
command.Parameters.AddWithValue("@content", quote.Content); command.Parameters.AddWithValue("@content", quote.Content);
@ -38,33 +39,29 @@ namespace WF_WebAdmin.Service
command.Parameters.AddWithValue("@img_path", quote.ImgPath); command.Parameters.AddWithValue("@img_path", quote.ImgPath);
*/ */
try try
{ {
// Ouvrir la connexion à la base de données
await connection.OpenAsync(); await connection.OpenAsync();
// Exécuter la commande d'insertion
await command.ExecuteNonQueryAsync(); await command.ExecuteNonQueryAsync();
} }
catch (Exception ex) catch (Exception ex)
{ {
// Gérer les erreurs ici (par exemple, afficher ou enregistrer les erreurs)
Console.WriteLine($"Une erreur est survenue lors de l'ajout de la citation : {ex.Message}"); Console.WriteLine($"Une erreur est survenue lors de l'ajout de la citation : {ex.Message}");
} }
finally finally
{ {
// Fermer la connexion (automatiquement géré avec `using`, mais ajouté pour explicitement montrer le processus)
await connection.CloseAsync(); await connection.CloseAsync();
} }
} }
// Retourner l'objet DTO pour que vous puissiez l'utiliser ailleurs dans votre application
return quoteDTO; return quoteDTO;
} }
/// <summary>
public Task RemoveQuote(Quote quote) /// Supprime une citation de la base de données.
/// </summary>
/// <param name="quote">Citation à supprimer.</param>
public Task RemoveQuote(Quote quote)
{ {
QuoteExtension extension = new QuoteExtension(); QuoteExtension extension = new QuoteExtension();
QuoteDTO quoteDTO = extension.QuoteToDTO(quote); QuoteDTO quoteDTO = extension.QuoteToDTO(quote);
@ -72,6 +69,10 @@ namespace WF_WebAdmin.Service
return Task.FromResult(quoteDTO); return Task.FromResult(quoteDTO);
} }
/// <summary>
/// Valide une citation.
/// </summary>
/// <param name="quote">Citation à valider.</param>
public Task validQuote(Quote quote) public Task validQuote(Quote quote)
{ {
QuoteExtension extension = new QuoteExtension(); QuoteExtension extension = new QuoteExtension();
@ -80,6 +81,10 @@ namespace WF_WebAdmin.Service
return Task.FromResult(quoteDTO); return Task.FromResult(quoteDTO);
} }
/// <summary>
/// Met à jour une citation existante.
/// </summary>
/// <param name="quote">Citation mise à jour.</param>
public Task updateQuote(Quote quote) public Task updateQuote(Quote quote)
{ {
QuoteExtension extension = new QuoteExtension(); QuoteExtension extension = new QuoteExtension();
@ -88,61 +93,89 @@ namespace WF_WebAdmin.Service
return Task.FromResult(quoteDTO); return Task.FromResult(quoteDTO);
} }
/// <summary>
/// Ajoute une citation (non implémenté).
/// </summary>
public Task addQuote(Quote quote) public Task addQuote(Quote quote)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Supprime une citation (non implémenté).
/// </summary>
public Task removeQuote(Quote quote) public Task removeQuote(Quote quote)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère toutes les citations (non implémenté).
/// </summary>
public Task<List<Quote>> getAllQuote() public Task<List<Quote>> getAllQuote()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère un ensemble de citations paginées (non implémenté).
/// </summary>
public Task<List<Quote>> getSomeQuote(int nb, int page) public Task<List<Quote>> getSomeQuote(int nb, int page)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Recherche des citations selon des critères spécifiques (non implémenté).
/// </summary>
public Task<List<Quote>> reserchQuote(string reserch, List<string> argument) public Task<List<Quote>> reserchQuote(string reserch, List<string> argument)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère toutes les citations invalides (non implémenté).
/// </summary>
public Task<List<Quote>> getAllQuoteInvalid() public Task<List<Quote>> getAllQuoteInvalid()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère une liste paginée de citations invalides (non implémenté).
/// </summary>
public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page) public Task<List<Quote>> getSomeQuoteInvalid(int nb, int page)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère une citation spécifique en fonction de son ID (non implémenté).
/// </summary>
public Task<Quote> getOnequote(int id) public Task<Quote> getOnequote(int id)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère le nombre total de citations enregistrées (non implémenté).
/// </summary>
public Task<int> getNbQuote() public Task<int> getNbQuote()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère la liste des personnages (non implémenté).
/// </summary>
public Task<List<Character>> getChar() public Task<List<Character>> getChar()
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère la liste des sources (non implémenté).
/// </summary>
public Task<List<Source>> getSrc() public Task<List<Source>> getSrc()
{ {
throw new NotImplementedException(); throw new NotImplementedException();

@ -3,149 +3,210 @@ using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service; namespace WF_WebAdmin.Service;
public class QuoteServiceStub : IQuoteService /// <summary>
{ /// Service de gestion des citations utilisant un fichier JSON comme stockage.
/// </summary>
public class QuoteServiceStub : IQuoteService
{
private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataQuote.json"); private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataQuote.json");
private readonly string _char = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataCaracter.json"); private readonly string _char = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataCaracter.json");
private readonly string _src = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataSource.json"); private readonly string _src = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake-dataSource.json");
/// <summary>
/// Sauvegarde la liste des citations dans le fichier JSON.
/// </summary>
/// <param name="quotes">Liste des citations à sauvegarder.</param>
public async Task saveQuoteJson(List<Quote> quotes) public async Task saveQuoteJson(List<Quote> quotes)
{
var json = JsonSerializer.Serialize(quotes, new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(_jsonFilePath, json);
}
/// <summary>
/// Ajoute une nouvelle citation et l'enregistre dans le fichier JSON.
/// </summary>
/// <param name="quote">Citation à ajouter.</param>
public async Task addQuote(Quote quote)
{
var data = await getAllQuote();
quote.Id = data.Count > 0 ? data.Max(p => p.Id) + 1 : 1;
data.Add(quote);
await saveQuoteJson(data);
}
/// <summary>
/// Supprime une citation et met à jour le fichier JSON.
/// </summary>
/// <param name="quote">Citation à supprimer.</param>
public async Task removeQuote(Quote quote)
{
var data = await getAllQuote();
var q = data.FirstOrDefault(p => p.Id == quote.Id);
if (q != null)
{ {
var json = JsonSerializer.Serialize(quotes, new JsonSerializerOptions { WriteIndented = true }); data.Remove(q);
await File.WriteAllTextAsync(_jsonFilePath, json);
}
public async Task addQuote(Quote quote)
{
var data = await getAllQuote();
quote.Id = data.Count > 0 ? data.Max(p => p.Id) + 1 : 1;
data.Add(quote);
await saveQuoteJson(data); await saveQuoteJson(data);
} }
}
public async Task removeQuote(Quote quote) /// <summary>
{ /// Marque une citation comme valide.
var data = await getAllQuote(); /// </summary>
var q = data.FirstOrDefault(p => p.Id == quote.Id); /// <param name="quote">Citation à valider.</param>
if (q != null) public async Task validQuote(Quote quote)
{ {
data.Remove(q); throw new NotImplementedException();
await saveQuoteJson(data); }
}
} /// <summary>
/// Met à jour une citation existante.
public async Task validQuote(Quote quote) /// </summary>
{ /// <param name="quote">Citation mise à jour.</param>
throw new NotImplementedException(); public async Task updateQuote(Quote quote)
} {
var data = await getAllQuote();
public async Task updateQuote(Quote quote) var q = data.FirstOrDefault(p => p.Id == quote.Id);
if (q != null)
{ {
var data = await getAllQuote(); q.Content = quote.Content;
var q = data.FirstOrDefault(p => p.Id == quote.Id); q.Charac = quote.Charac;
if (q != null) q.ImgPath = quote.ImgPath;
{ q.TitleSrc = quote.TitleSrc;
q.Content = quote.Content; q.DateSrc = quote.DateSrc;
q.Charac = quote.Charac; q.Langue = quote.Langue;
q.ImgPath = quote.ImgPath; await saveQuoteJson(data);
q.TitleSrc = quote.TitleSrc;
q.DateSrc = quote.DateSrc;
q.Langue = quote.Langue;
await saveQuoteJson(data);
}
} }
}
public async Task<List<Quote>> getAllQuote() /// <summary>
/// Récupère toutes les citations stockées dans le fichier JSON.
/// </summary>
/// <returns>Une liste de citations.</returns>
public async Task<List<Quote>> getAllQuote()
{
if (!File.Exists(_jsonFilePath))
{ {
if (!File.Exists(_jsonFilePath)) Console.Out.WriteLine($"{_jsonFilePath} not found");
{ return new List<Quote>();
Console.Out.WriteLine($"{_jsonFilePath} not found");
return new List<Quote>();
}
var json = await File.ReadAllTextAsync(_jsonFilePath);
return JsonSerializer.Deserialize<List<Quote>>(json) ?? new List<Quote>();
} }
public async Task<List<Quote>> getSomeQuote(int nb, int page) var json = await File.ReadAllTextAsync(_jsonFilePath);
return JsonSerializer.Deserialize<List<Quote>>(json) ?? new List<Quote>();
}
/// <summary>
/// Récupère une liste paginée de citations.
/// </summary>
/// <param name="nb">Nombre de citations par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Une liste de citations correspondant à la page demandée.</returns>
public async Task<List<Quote>> getSomeQuote(int nb, int page)
{
var quotes = await getAllQuote();
if ((page - 1) * nb + nb > quotes.Count())
{ {
var quotes = await getAllQuote(); if (nb > quotes.Count())
if((page - 1) * nb + nb > quotes.Count())
{ {
if (nb > quotes.Count()) return quotes.GetRange(0, quotes.Count());
{
return quotes.GetRange(0, quotes.Count());
}
return quotes.GetRange(quotes.Count()-nb, nb);
} }
return quotes.GetRange((page - 1) * nb, nb); return quotes.GetRange(quotes.Count() - nb, nb);
} }
return quotes.GetRange((page - 1) * nb, nb);
public async Task<Quote> getOnequote(int id) }
/// <summary>
/// Récupère une citation spécifique en fonction de son ID.
/// </summary>
/// <param name="id">ID de la citation recherchée.</param>
/// <returns>La citation correspondante ou null si elle n'existe pas.</returns>
public async Task<Quote> getOnequote(int id)
{
var data = await getAllQuote();
var q = data.FirstOrDefault(p => p.Id == id);
return q;
}
/// <summary>
/// Recherche des citations selon des critères spécifiques.
/// </summary>
/// <param name="reserch">Terme de recherche.</param>
/// <param name="argument">Liste d'arguments pour affiner la recherche.</param>
/// <returns>Une liste de citations correspondant aux critères de recherche.</returns>
public async Task<List<Quote>> reserchQuote(string reserch, List<string> argument)
{
throw new NotImplementedException();
}
/// <summary>
/// Récupère toutes les citations invalides.
/// </summary>
/// <returns>Une liste de citations non validées.</returns>
public async Task<List<Quote>> getAllQuoteInvalid()
{
var quotes = await getAllQuote();
quotes = quotes.Where(q => q.IsValid == false).ToList();
return quotes;
}
/// <summary>
/// Récupère une liste paginée de citations invalides.
/// </summary>
/// <param name="nb">Nombre de citations par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Une liste de citations non validées correspondant à la page demandée.</returns>
public async Task<List<Quote>> getSomeQuoteInvalid(int nb, int page)
{
var quotes = await getAllQuoteInvalid();
if ((page - 1) * nb + nb > quotes.Count())
{ {
var data = await getAllQuote(); if (nb > quotes.Count())
var q = data.FirstOrDefault(p => p.Id == id);
if (q != null)
{ {
return q; return quotes.GetRange(0, quotes.Count());
} }
return null; return quotes.GetRange(quotes.Count() - nb, nb);
} }
return quotes.GetRange((page - 1) * nb, nb);
public async Task<List<Quote>> reserchQuote(string reserch, List<string> argument) }
{
throw new NotImplementedException(); /// <summary>
} /// Récupère le nombre total de citations enregistrées.
/// </summary>
public async Task<List<Quote>> getAllQuoteInvalid() /// <returns>Nombre total de citations.</returns>
{ public async Task<int> getNbQuote()
var quotes = await getAllQuote(); {
quotes = quotes.Where(q => q.IsValid == false).ToList(); var data = await getAllQuote();
return quotes; return data.Count;
} }
public async Task<List<Quote>> getSomeQuoteInvalid(int nb, int page) /// <summary>
/// Récupère la liste des personnages depuis le fichier JSON.
/// </summary>
/// <returns>Une liste de personnages.</returns>
public async Task<List<Character>> getChar()
{
if (!File.Exists(_char))
{ {
var quotes = await getAllQuoteInvalid(); Console.Out.WriteLine($"{_char} not found");
if ((page - 1) * nb + nb > quotes.Count()) return new List<Character>();
{
if (nb > quotes.Count())
{
return quotes.GetRange(0, quotes.Count());
}
return quotes.GetRange(quotes.Count() - nb, nb);
}
return quotes.GetRange((page - 1) * nb, nb);
} }
public async Task<int> getNbQuote() var json = await File.ReadAllTextAsync(_char);
{ return JsonSerializer.Deserialize<List<Character>>(json) ?? new List<Character>();
var data = await getAllQuote(); }
return data.Count;
}
public async Task<List<Character>> getChar() /// <summary>
/// Récupère la liste des sources depuis le fichier JSON.
/// </summary>
/// <returns>Une liste de sources.</returns>
public async Task<List<Source>> getSrc()
{
if (!File.Exists(_src))
{ {
if (!File.Exists(_char)) Console.Out.WriteLine($"{_src} not found");
{ return new List<Source>();
Console.Out.WriteLine($"{_char} not found");
return new List<Character>();
}
var json = await File.ReadAllTextAsync(_char);
return JsonSerializer.Deserialize<List<Character>>(json) ?? new List<Character>();
} }
public async Task<List<Source>> getSrc() var json = await File.ReadAllTextAsync(_src);
{ return JsonSerializer.Deserialize<List<Source>>(json) ?? new List<Source>();
if (!File.Exists(_src)) }
{
Console.Out.WriteLine($"{_src} not found");
return new List<Source>();
}
var json = await File.ReadAllTextAsync(_src);
return JsonSerializer.Deserialize<List<Source>>(json) ?? new List<Source>();
}
} }

@ -3,17 +3,27 @@ using WF_WebAdmin.Model;
namespace WF_WebAdmin.Service; namespace WF_WebAdmin.Service;
/// <summary>
/// Service de gestion des utilisateurs utilisant un fichier JSON comme stockage.
/// </summary>
public class UserServiceStub : IUserService public class UserServiceStub : IUserService
{ {
private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake_data_users.json"); private readonly string _jsonFilePath = Path.Combine(Environment.CurrentDirectory, "wwwroot", "fake_data_users.json");
/// <summary>
/// Sauvegarde la liste des utilisateurs dans le fichier JSON.
/// </summary>
/// <param name="users">Liste des utilisateurs à sauvegarder.</param>
public async Task saveUsersJson(List<User> users) public async Task saveUsersJson(List<User> users)
{ {
var json = JsonSerializer.Serialize(users, new JsonSerializerOptions { WriteIndented = true }); var json = JsonSerializer.Serialize(users, new JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync(_jsonFilePath, json); await File.WriteAllTextAsync(_jsonFilePath, json);
} }
/// <summary>
/// Supprime un utilisateur de la liste et met à jour le fichier JSON.
/// </summary>
/// <param name="user">Utilisateur à supprimer.</param>
public async Task removeUser(User user) public async Task removeUser(User user)
{ {
var data = await getAllUser(); var data = await getAllUser();
@ -25,18 +35,30 @@ public class UserServiceStub : IUserService
} }
} }
/// <summary>
/// Met à jour le rôle d'un utilisateur pour le passer en administrateur.
/// </summary>
/// <param name="user">Utilisateur à promouvoir.</param>
public Task updateRole(User user) public Task updateRole(User user)
{ {
user.IsAdmin = true; user.IsAdmin = true;
return updateUser(user); return updateUser(user);
} }
/// <summary>
/// Rétrograde un administrateur en utilisateur normal.
/// </summary>
/// <param name="user">Utilisateur à rétrograder.</param>
public Task downgradeRole(User user) public Task downgradeRole(User user)
{ {
user.IsAdmin = false; user.IsAdmin = false;
return updateUser(user); return updateUser(user);
} }
/// <summary>
/// Récupère tous les utilisateurs stockés dans le fichier JSON.
/// </summary>
/// <returns>Une liste d'utilisateurs.</returns>
public async Task<List<User>> getAllUser() public async Task<List<User>> getAllUser()
{ {
if (!File.Exists(_jsonFilePath)) if (!File.Exists(_jsonFilePath))
@ -49,6 +71,12 @@ public class UserServiceStub : IUserService
return JsonSerializer.Deserialize<List<User>>(json) ?? new List<User>(); return JsonSerializer.Deserialize<List<User>>(json) ?? new List<User>();
} }
/// <summary>
/// Récupère une liste paginée d'utilisateurs.
/// </summary>
/// <param name="nb">Nombre d'utilisateurs par page.</param>
/// <param name="page">Numéro de la page.</param>
/// <returns>Une liste d'utilisateurs correspondant à la page demandée.</returns>
public async Task<List<User>> getSomeUser(int nb, int page) public async Task<List<User>> getSomeUser(int nb, int page)
{ {
var users = await getAllUser(); var users = await getAllUser();
@ -59,39 +87,54 @@ public class UserServiceStub : IUserService
return users.GetRange((page - 1) * nb, nb); return users.GetRange((page - 1) * nb, nb);
} }
/// <summary>
/// Récupère un utilisateur spécifique en fonction de son ID.
/// </summary>
/// <param name="id">ID de l'utilisateur recherché.</param>
/// <returns>L'utilisateur correspondant à l'ID ou null s'il n'existe pas.</returns>
public async Task<User> getOneUser(int id) public async Task<User> getOneUser(int id)
{ {
var data = await getAllUser(); var data = await getAllUser();
var u = data.FirstOrDefault(p => p.Id == id); var u = data.FirstOrDefault(p => p.Id == id);
if (u != null) return u;
{
return u;
}
return null;
} }
/// <summary>
/// Recherche des utilisateurs selon des critères spécifiques.
/// </summary>
/// <param name="reserch">Terme de recherche.</param>
/// <param name="args">Liste des arguments supplémentaires pour affiner la recherche.</param>
/// <returns>Une liste d'utilisateurs correspondant aux critères de recherche.</returns>
public Task<List<User>> reserchUsers(string reserch, List<string> args) public Task<List<User>> reserchUsers(string reserch, List<string> args)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
/// <summary>
/// Récupère le nombre total d'utilisateurs enregistrés.
/// </summary>
/// <returns>Nombre total d'utilisateurs.</returns>
public async Task<int> getNbUser() public async Task<int> getNbUser()
{ {
var data = await getAllUser(); var data = await getAllUser();
return data.Count; return data.Count;
} }
/// <summary>
/// Met à jour les informations d'un utilisateur existant.
/// </summary>
/// <param name="user">Utilisateur avec les nouvelles informations.</param>
public async Task updateUser(User user) public async Task updateUser(User user)
{ {
var data = await getAllUser(); var data = await getAllUser();
var person = data.FirstOrDefault(p => p.Id == user.Id); var person = data.FirstOrDefault(p => p.Id == user.Id);
if (person != null) if (person != null)
{ {
person.Name = user.Name; person.Name = user.Name;
person.Email = user.Email; person.Email = user.Email;
person.Image = user.Image; person.Image = user.Image;
person.IsAdmin = user.IsAdmin; person.IsAdmin = user.IsAdmin;
await saveUsersJson(data); await saveUsersJson(data);
} }
} }
} }
Loading…
Cancel
Save