From 73ba685aa2916f510cab3ba1d96cef7c50a0a076 Mon Sep 17 00:00:00 2001 From: Nestisse Date: Wed, 13 Mar 2024 15:21:13 +0100 Subject: [PATCH 1/3] =?UTF-8?q?Ajout=20de=20la=20strat=C3=A9gie=20pour=20f?= =?UTF-8?q?aciliter=20la=20r=C3=A9cup=C3=A9ration=20en=20base=20de=20donn?= =?UTF-8?q?=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API_SQLuedo/DbContextLib/UserDbContext.cs | 14 +++++++---- .../EntityFramework/ContentLessonEntity.cs | 5 ++-- .../StubbedContextLib/StubbedContext.cs | 23 ++++++++++++++++--- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/API_SQLuedo/DbContextLib/UserDbContext.cs b/API_SQLuedo/DbContextLib/UserDbContext.cs index 6352ab8..b5feec4 100644 --- a/API_SQLuedo/DbContextLib/UserDbContext.cs +++ b/API_SQLuedo/DbContextLib/UserDbContext.cs @@ -12,28 +12,34 @@ namespace DbContextLib public DbSet Inquiry { get; set; } public DbSet InquiryTable { get; set; } public DbSet Lesson { get; set; } - public DbSet ContentLessons { get; set; } public DbSet Paragraph { get; set; } public DbSet Solutions { get; set; } public DbSet Success { get; set; } public DbSet Notepad { get; set; } - public UserDbContext(DbContextOptions options) : base(options) { } + + public UserDbContext(DbContextOptions options) : base(options) + { + } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseNpgsql("Host=localhost;Database=SQLuedo;Username=admin;Password=motdepasse"); } + base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) { - modelBuilder.Entity().HasKey(c => c.LessonId); + // Permet d'avoir les champs de la classe mère dans les classes filles et de ne pas avoir de table pour la classe mère + modelBuilder.Entity().UseTpcMappingStrategy(); + modelBuilder.Entity().HasKey(s => s.UserId); modelBuilder.Entity().HasKey(s => s.InquiryId); modelBuilder.Entity().HasKey(s => s.Id); base.OnModelCreating(modelBuilder); } } -} +} \ No newline at end of file diff --git a/API_SQLuedo/EntityFramework/ContentLessonEntity.cs b/API_SQLuedo/EntityFramework/ContentLessonEntity.cs index ee81947..63ae177 100644 --- a/API_SQLuedo/EntityFramework/ContentLessonEntity.cs +++ b/API_SQLuedo/EntityFramework/ContentLessonEntity.cs @@ -2,14 +2,13 @@ namespace Entities; -[Table("ContentLesson")] public abstract class ContentLessonEntity { public int Id { get; set; } public string ContentContent { get; set; } public string ContentTitle { get; set; } - [ForeignKey(nameof(Lesson))] public int LessonId { get; set; } - public LessonEntity Lesson { get; set; } = null!; + [ForeignKey(nameof(Lesson))] public virtual int LessonId { get; set; } + public virtual LessonEntity Lesson { get; set; } = null!; protected ContentLessonEntity() { diff --git a/API_SQLuedo/StubbedContextLib/StubbedContext.cs b/API_SQLuedo/StubbedContextLib/StubbedContext.cs index e87f12f..0489139 100644 --- a/API_SQLuedo/StubbedContextLib/StubbedContext.cs +++ b/API_SQLuedo/StubbedContextLib/StubbedContext.cs @@ -1,5 +1,4 @@ -using System.Runtime.CompilerServices; -using System.Security.Cryptography; +using System.Security.Cryptography; using DbContextLib; using Entities; using Microsoft.AspNetCore.Cryptography.KeyDerivation; @@ -63,7 +62,25 @@ public class StubbedContext : UserDbContext modelBuilder.Entity().HasData( new SolutionEntity(1, "Maxime", "Sapountzis", "La cuisine", "Le couteau", "Parce que c'est Maxime"), - new SolutionEntity(2, "Johnny", "Ratton", "La cuisine", "Le couteau", "Parce que il est ra****"), + new SolutionEntity(2, "Johnny", "Ratton", "La cuisine", "Le couteau", "Parce que il est fou"), new SolutionEntity(3, "Erwan", "Menager", "La salle de bain", "L'arachide", "Parce que c'est Erwan")); + + modelBuilder.Entity().HasData( + new LessonEntity(1, "La cuisine", "Maxime", new DateOnly(2021, 10, 10)), + new LessonEntity(2, "La salle de bain", "Erwan", new DateOnly(2021, 10, 10)), + new LessonEntity(3, "La chambre", "Johnny", new DateOnly(2021, 10, 10)), + new LessonEntity(4, "Le salon", "Clement", new DateOnly(2021, 10, 10))); + + modelBuilder.Entity().HasData( + new ParagraphEntity(1, "Le premier paragraphe", "Le contenu du premier paragraphe", "Attention", "La query", + "Le commentaire", 1), + new ParagraphEntity(2, "Le deuxième paragraphe", "Le contenu du deuxième paragraphe", "Attention", + "La query", "Le commentaire", 1), + new ParagraphEntity(3, "Le troisième paragraphe", "Le contenu du troisième paragraphe", "Attention", + "query", "commentaire", 2), + new ParagraphEntity(4, "Le quatrième paragraphe", "Le contenu du quatrième paragraphe", "Attention", + "La query", "Le commentaire", 3), + new ParagraphEntity(5, "Le cinquième paragraphe", "Le contenu du quatrième paragraphe", "Attention", + "La query", "Le commentaire", 4)); } } \ No newline at end of file From 231f9bd878700aebdcf8adc4a45959072c37fbe3 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Fri, 15 Mar 2024 17:53:48 +0100 Subject: [PATCH 2/3] Ajout de constructeur vide pour les DTO qui n'en avaient pas --- API_SQLuedo/Dto/BlackListDTO.cs | 1 + API_SQLuedo/Dto/InquiryDTO.cs | 1 + API_SQLuedo/Dto/ParagraphDTO.cs | 10 +++++----- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/API_SQLuedo/Dto/BlackListDTO.cs b/API_SQLuedo/Dto/BlackListDTO.cs index 913aaa0..a8a5a63 100644 --- a/API_SQLuedo/Dto/BlackListDTO.cs +++ b/API_SQLuedo/Dto/BlackListDTO.cs @@ -5,6 +5,7 @@ public class BlackListDTO public string Email { get; set; } public DateOnly ExpirationDate { get; set; } + public BlackListDTO() {} public BlackListDTO(string email, DateOnly expirationDate) { Email = email; diff --git a/API_SQLuedo/Dto/InquiryDTO.cs b/API_SQLuedo/Dto/InquiryDTO.cs index 5a436ed..f734ce7 100644 --- a/API_SQLuedo/Dto/InquiryDTO.cs +++ b/API_SQLuedo/Dto/InquiryDTO.cs @@ -10,6 +10,7 @@ public class InquiryDTO public bool IsUser { get; set; } + public InquiryDTO(){} public InquiryDTO(int id, string title, string description, bool isUser) { Id = id; diff --git a/API_SQLuedo/Dto/ParagraphDTO.cs b/API_SQLuedo/Dto/ParagraphDTO.cs index f6925dd..13c702f 100644 --- a/API_SQLuedo/Dto/ParagraphDTO.cs +++ b/API_SQLuedo/Dto/ParagraphDTO.cs @@ -29,9 +29,9 @@ public class ParagraphDTO : ContentLessonDTO Info = info; Query = query; Comment = comment; - } - - public ParagraphDTO() : base() - { - } + } + + public ParagraphDTO() : base() + { + } } \ No newline at end of file From 5a8d8fe4e9f9f72b56f8b2a9cd8e528323c572d9 Mon Sep 17 00:00:00 2001 From: "Johnny.Ratton" Date: Fri, 15 Mar 2024 19:30:07 +0100 Subject: [PATCH 3/3] =?UTF-8?q?R=C3=A9glage=20de=20diff=C3=A9rents=20bugs?= =?UTF-8?q?=20et=20incoh=C3=A9rences=20li=C3=A9s=20aux=20succ=C3=A8s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/Controllers/SuccessesController.cs | 33 +++++++-------- .../API/Service/SuccessDataServiceAPI.cs | 10 ++--- .../Service/SuccessDataService.cs | 42 ++++++++++--------- API_SQLuedo/Shared/ISuccessService.cs | 8 ++-- API_SQLuedo/TestConsoleAPI/Program.cs | 14 ++++--- 5 files changed, 55 insertions(+), 52 deletions(-) diff --git a/API_SQLuedo/API/Controllers/SuccessesController.cs b/API_SQLuedo/API/Controllers/SuccessesController.cs index ca9a8a6..0a48938 100644 --- a/API_SQLuedo/API/Controllers/SuccessesController.cs +++ b/API_SQLuedo/API/Controllers/SuccessesController.cs @@ -47,7 +47,7 @@ namespace API.Controllers try { _logger.LogInformation("[INFORMATION] Le succès avec l'id de l'utilisateur {id} a été trouvé.", id); - return Ok(_successDataService.GetSuccessByUserId(id)); + return Ok(_successDataService.GetSuccessesByUserId(id)); } catch (ArgumentException) { @@ -65,7 +65,7 @@ namespace API.Controllers { _logger.LogInformation("[INFORMATION] Utilisateur avec l'id de l'enquête {inquiryId} a été trouvé.", id); - return Ok(_successDataService.GetSuccessByInquiryId(id)); + return Ok(_successDataService.GetSuccessesByInquiryId(id)); } catch (ArgumentException) { @@ -74,20 +74,20 @@ namespace API.Controllers } } - [HttpDelete("success/{id:int}")] + [HttpDelete("success/{idUser:int}/{idInquiry:int}")] [ProducesResponseType(typeof(SuccessDTO), 200)] [ProducesResponseType(typeof(string), 404)] - public IActionResult DeleteSuccess(int id) + public IActionResult DeleteSuccess(int idUser, int idInquiry) { - var success = _successDataService.DeleteSuccess(id); + var success = _successDataService.DeleteSuccess(idUser, idInquiry); if (success) { - _logger.LogInformation("[INFORMATION] Le succès avec l'id {id} a été supprimé.", id); - return Ok(_successDataService.DeleteSuccess(id)); + _logger.LogInformation("[INFORMATION] Le succès avec l'id {id} a été supprimé.", idUser); + return Ok(success); } else { - _logger.LogError("[ERREUR] Aucun succès trouvé avec l'id {id}.", id); + _logger.LogError("[ERREUR] Aucun succès trouvé avec l'id {id}.", idUser); return NotFound(); } } @@ -108,35 +108,34 @@ namespace API.Controllers _successDataService.CreateSuccess(dto.UserId, dto.InquiryId, dto.IsFinished)); } - [HttpPut("success/{id:int}")] + [HttpPut("success/{idUser:int}/{idInquiry:int}")] [ProducesResponseType(typeof(SuccessDTO), 200)] [ProducesResponseType(typeof(string), 400)] [ProducesResponseType(typeof(string), 404)] - public IActionResult UpdateSuccess(int id, [FromBody] SuccessDTO successDTO) + public IActionResult UpdateSuccess(int idUser, int idInquiry, [FromBody] SuccessDTO successDTO) { - if (id != successDTO.UserId) + if (idUser != successDTO.UserId || idInquiry != successDTO.InquiryId) { _logger.LogError( - "[ERREUR] Problème ID - La mise à jour du succès avec l'id de l'utilisateur {id} a échouée.", id); + "[ERREUR] Problème ID - La mise à jour du succès avec l'id de l'utilisateur {id} a échouée.", idUser); return BadRequest(); } - if (!ModelState.IsValid) { _logger.LogError( "[ERREUR] Problème controlleur - La mise à jour du succès avec l'id de l'utilisateur {id} a échouée.", - id); + idUser); return BadRequest(); } if (successDTO != null) { _logger.LogInformation( - "[INFORMATION] La mise à jour du succès avec l'id de l'utilisateur {id} a été effectuée", id); - return Ok(_successDataService.UpdateSuccess(id, successDTO)); + "[INFORMATION] La mise à jour du succès avec l'id de l'utilisateur {id} a été effectuée", idUser); + return Ok(_successDataService.UpdateSuccess(idUser,idInquiry, successDTO)); } - _logger.LogError("[ERREUR] Aucun succès trouvé avec l'id de l'utilisateur {id}.", id); + _logger.LogError("[ERREUR] Aucun succès trouvé avec l'id de l'utilisateur {id}.", idUser); return NotFound(); } } diff --git a/API_SQLuedo/API/Service/SuccessDataServiceAPI.cs b/API_SQLuedo/API/Service/SuccessDataServiceAPI.cs index af403c5..047203d 100644 --- a/API_SQLuedo/API/Service/SuccessDataServiceAPI.cs +++ b/API_SQLuedo/API/Service/SuccessDataServiceAPI.cs @@ -14,14 +14,14 @@ public class SuccessDataServiceApi(ISuccessService sucessService) return successesEntities.Select(e => e.FromEntityToDTO()).ToList(); } - public SuccessDTO GetSuccessByUserId(int id) => sucessService.GetSuccessByUserId(id).FromEntityToDTO(); + public IEnumerable GetSuccessesByUserId(int id) => sucessService.GetSuccessesByUserId(id).Select(s => s.FromEntityToDTO()); - public SuccessDTO GetSuccessByInquiryId(int id) => sucessService.GetSuccessByInquiryId(id).FromEntityToDTO(); + public IEnumerable GetSuccessesByInquiryId(int id) => sucessService.GetSuccessesByInquiryId(id).Select(s => s.FromEntityToDTO()); - public bool DeleteSuccess(int id) => sucessService.DeleteSuccess(id); + public bool DeleteSuccess(int idUser, int idInquiry) => sucessService.DeleteSuccess(idUser, idInquiry); - public SuccessDTO UpdateSuccess(int id, SuccessDTO success) => - sucessService.UpdateSuccess(id, success.FromDTOToEntity()).FromEntityToDTO(); + public SuccessDTO UpdateSuccess(int idUser, int idInquiry, SuccessDTO success) => + sucessService.UpdateSuccess(idUser, idInquiry, success.FromDTOToEntity()).FromEntityToDTO(); public SuccessDTO CreateSuccess(int userId, int inquiryId, bool isFinished) => sucessService.CreateSuccess(userId, inquiryId, isFinished).FromEntityToDTO(); diff --git a/API_SQLuedo/DbDataManager/Service/SuccessDataService.cs b/API_SQLuedo/DbDataManager/Service/SuccessDataService.cs index 36335d3..a247a24 100644 --- a/API_SQLuedo/DbDataManager/Service/SuccessDataService.cs +++ b/API_SQLuedo/DbDataManager/Service/SuccessDataService.cs @@ -40,55 +40,53 @@ public class SuccessDataService : ISuccessService return successes; } - public SuccessEntity GetSuccessByUserId(int id) + public IEnumerable GetSuccessesByUserId(int id) { - var userEntity = DbContext.Successes.FirstOrDefault(u => u.UserId == id); - if (userEntity == null) + var successes = DbContext.Successes.Where(u => u.UserId == id); + if (successes == null) { throw new ArgumentException("Impossible de trouver le succès", nameof(id)); } - return userEntity; + return successes; } - public SuccessEntity GetSuccessByInquiryId(int id) + public IEnumerable GetSuccessesByInquiryId(int id) { - var userEntity = DbContext.Successes.FirstOrDefault(u => u.InquiryId == id); - if (userEntity == null) + var successes = DbContext.Successes.Where(u => u.InquiryId == id); + if (successes == null) { throw new ArgumentException("Impossible de trouver le succès", nameof(id)); } - return userEntity; + return successes; } - public bool DeleteSuccess(int id) + public bool DeleteSuccess(int idUser, int idInquiry) { - var successEntity = DbContext.Successes.FirstOrDefault(u => u.UserId == id); + var successEntity = DbContext.Successes.FirstOrDefault(u => u.UserId == idUser && u.InquiryId == idInquiry); if (successEntity == null) { return false; } - DbContext.Successes.Remove(successEntity); DbContext.SaveChangesAsync(); return true; } - public SuccessEntity UpdateSuccess(int id, SuccessEntity success) + public SuccessEntity UpdateSuccess(int idUser, int idInquiry, SuccessEntity success) { - var updatingSuccess = DbContext.Successes.FirstOrDefault(u => u.UserId == id); + var updatingSuccess = DbContext.Successes.FirstOrDefault(u => u.UserId == idUser && u.InquiryId == idInquiry); if (updatingSuccess == null) { - throw new ArgumentException("Impossible de trouver le succès", nameof(id)); + throw new ArgumentException("Impossible de trouver le succès", nameof(idUser)); } - - foreach (var pptt in typeof(SuccessEntity).GetProperties().Where(p => + /*foreach (var pptt in typeof(SuccessEntity).GetProperties().Where(p => p.CanWrite && p.Name != nameof(SuccessEntity.UserId) && p.Name != nameof(SuccessEntity.InquiryId))) { pptt.SetValue(updatingSuccess, pptt.GetValue(success)); - } - + }*/ + updatingSuccess.IsFinished = success.IsFinished; DbContext.SaveChangesAsync(); return updatingSuccess; } @@ -101,8 +99,12 @@ public class SuccessDataService : ISuccessService InquiryId = inquiryId, IsFinished = isFinished, }; - DbContext.Successes.Add(newSuccessEntity); - DbContext.SaveChangesAsync(); + var success = DbContext.Successes.Where(s => s.UserId == userId && s.InquiryId == inquiryId); + if (success == null) + { + DbContext.Successes.Add(newSuccessEntity); + DbContext.SaveChangesAsync(); + } return newSuccessEntity; } } \ No newline at end of file diff --git a/API_SQLuedo/Shared/ISuccessService.cs b/API_SQLuedo/Shared/ISuccessService.cs index 07e5f9c..29932ff 100644 --- a/API_SQLuedo/Shared/ISuccessService.cs +++ b/API_SQLuedo/Shared/ISuccessService.cs @@ -5,10 +5,10 @@ namespace Shared public interface ISuccessService { public IEnumerable GetSuccesses(int page, int number, SuccessOrderCriteria orderCriteria); - public TSuccess GetSuccessByUserId(int id); - public TSuccess GetSuccessByInquiryId(int id); - public bool DeleteSuccess(int id); - public TSuccess UpdateSuccess(int id, TSuccess success); + public IEnumerable GetSuccessesByUserId(int id); + public IEnumerable GetSuccessesByInquiryId(int id); + public bool DeleteSuccess(int idUser, int idInquiry); + public TSuccess UpdateSuccess(int idUser, int idInquiry, TSuccess success); public TSuccess CreateSuccess(int userId, int inquiryId, bool isFinished); } } \ No newline at end of file diff --git a/API_SQLuedo/TestConsoleAPI/Program.cs b/API_SQLuedo/TestConsoleAPI/Program.cs index a3b4275..6622ca8 100644 --- a/API_SQLuedo/TestConsoleAPI/Program.cs +++ b/API_SQLuedo/TestConsoleAPI/Program.cs @@ -519,13 +519,13 @@ using (var context = new UserDbContext(options)) { Console.WriteLine("Succès trouvé !\n"); Console.WriteLine("Veuillez saisir l'identifiant de l'utilisateur lié au succès :"); - var userId = Console.ReadLine(); + var userId = int.Parse(Console.ReadLine()); Console.WriteLine("Veuillez saisir l'identifiant de l'enquête lié au succès :"); - var inquiryId = Console.ReadLine(); + var inquiryId = int.Parse(Console.ReadLine()); Console.WriteLine("Veuillez saisir si l'enquête est terminée (0/1) :"); var isFinished = Console.ReadLine(); - var retour = successController.UpdateSuccess(id, - new SuccessDTO(int.Parse(userId), int.Parse(inquiryId), bool.Parse(isFinished))); + var retour = successController.UpdateSuccess(userId, inquiryId, + new SuccessDTO(userId, inquiryId, bool.Parse(isFinished))); if (retour.GetType() == typeof(OkObjectResult)) { Console.WriteLine("Mise à jour effectué avec succès !"); @@ -605,8 +605,10 @@ using (var context = new UserDbContext(options)) void DeleteSuccess() { Console.WriteLine("Quel est l'identifiant de l'utilisateur lié au succès à supprimer ?"); - var id = int.Parse(Console.ReadLine()); - var res = successController.DeleteSuccess(id); + var idUser = int.Parse(Console.ReadLine()); + Console.WriteLine("Quel est l'identifiant de l'enquête lié au succès à supprimer ?"); + var idInquiry = int.Parse(Console.ReadLine()); + var res = successController.DeleteSuccess(idUser,idInquiry); if (res.GetType() == typeof(OkObjectResult)) { Console.WriteLine("La suppression a été effectuée avec succès !");