From eb0af16e6a0a6123cf153a369441744ac93f7ee7 Mon Sep 17 00:00:00 2001 From: kekentin Date: Wed, 2 Apr 2025 17:35:16 +0200 Subject: [PATCH] Route Favorite Remove A finir (supr favorite de la liste dans Quote et User) --- WF_EF_Api/Contextlib/DbFavoriteManager.cs | 85 +++++++++++++++++-- WF_EF_Api/Dto2Entities/Extention.cs | 24 +++++- WF_EF_Api/ServicesApi/FavoriteService.cs | 2 +- ...iteControleur.cs => FavoriteController.cs} | 33 +++++-- WF_EF_Api/WfApi/Program.cs | 1 + 5 files changed, 128 insertions(+), 17 deletions(-) rename WF_EF_Api/WfApi/Controllers/{FavoriteControleur.cs => FavoriteController.cs} (79%) diff --git a/WF_EF_Api/Contextlib/DbFavoriteManager.cs b/WF_EF_Api/Contextlib/DbFavoriteManager.cs index 27e1b90..1b84dd2 100644 --- a/WF_EF_Api/Contextlib/DbFavoriteManager.cs +++ b/WF_EF_Api/Contextlib/DbFavoriteManager.cs @@ -1,4 +1,6 @@ using Entity; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Internal; using Shared; using System; using System.Collections.Generic; @@ -11,41 +13,108 @@ namespace Contextlib public class DbFavoriteManager : IFavoriteService { private WTFContext _context; + private GenericRepository _repo; public DbFavoriteManager(WTFContext context) { _context = context ?? throw new ArgumentNullException(nameof(context), "Database context cannot be null."); + _repo = new GenericRepository(context); } public async Task AddFavorite(int quoteid, int userId) { - throw new NotImplementedException(); + var quote = await _context.quotes // collection des commentaires est chargée + .Include(q => q.Favorite) + .FirstOrDefaultAsync(q => q.Id == quoteid); + + if (quote == null) + { + throw new ArgumentException("Quote not exist", nameof(quoteid)); + } + var user = await _context.users // collection des commentaires est chargée + .Include(u => u.Favorite) + .FirstOrDefaultAsync(q => q.Id == userId); + if (user == null) + { + throw new ArgumentException("User not exist", nameof(userId)); + } + + var fav = new Favorite + { + // Lien entre le favorite et la citation + Quote = quote, + IdQuote = quoteid, + // Lien entre le favorite et le user + Users = user, + IdUsers = userId, + }; + + if (fav != null) + { + // Ajout favorite à la collection des favorites de la citation + quote.Favorite.Add(user); + + // Ajout favorite à la collection des favorites de la citation + user.Favorite.Add(quote); + } + _context.Add(fav); + await _context.SaveChangesAsync(); } public async Task RemoveAllFavoriteForQuote(int quoteId) { - throw new NotImplementedException(); + var fav = await _context.quotes.Where(item => item.Id==quoteId) + .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images).Include(q => q.Favorite) + .ToListAsync(); + + if (fav == null) throw new KeyNotFoundException(); + + foreach (var item in fav) + { + _repo.Delete(item); + } + + await _context.SaveChangesAsync(); } public async Task RemoveAllFavoriteForUser(int userId) { - throw new NotImplementedException(); + var fav = (await this.GetFavoriteByIdUser(userId,0,_repo.Count())).items; + + if (fav == null) throw new KeyNotFoundException(); + + foreach (var item in fav) + { + _repo.Delete(item); + } + + await _context.SaveChangesAsync(); } public async Task RemoveFavorite(int quoteid, int userId) { - throw new NotImplementedException(); + var fav = await this.GetFavorite(userId, quoteid); + + if (fav == null) throw new KeyNotFoundException(); + _repo.Delete(fav); + + await _context.SaveChangesAsync(); } - public Task GetFavorite(int userId, int idQuote) + public async Task GetFavorite(int userId, int idQuote) { - throw new NotImplementedException(); + return await _context.quotes.Where( item => item.Id == idQuote && item.Favorite.Any(u => u.Id == userId) ) + .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images).Include(q=>q.Favorite) + .FirstOrDefaultAsync(); } - public Task> GetFavoriteByIdUser(int userId, int index, int count) + public async Task> GetFavoriteByIdUser(int userId, int index, int count) { - throw new NotImplementedException(); + List fav = await _context.quotes.Where(item => item.Favorite.Any(u => u.Id == userId)) + .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images).Include(q => q.Favorite) + .Skip(index * count).Take(count).ToListAsync(); + return new PaginationResult(fav.Count,index,count,fav); } } } diff --git a/WF_EF_Api/Dto2Entities/Extention.cs b/WF_EF_Api/Dto2Entities/Extention.cs index 1687d94..a453875 100644 --- a/WF_EF_Api/Dto2Entities/Extention.cs +++ b/WF_EF_Api/Dto2Entities/Extention.cs @@ -15,6 +15,7 @@ namespace Dto2Entities public static CharacterDTO ToDto(this Character item) { + if (item == null) return null; CharacterDTO character = new CharacterDTO(); character.Id = item.Id; character.Name = item.Name; @@ -34,6 +35,7 @@ namespace Dto2Entities public static CommentaryDTO ToDto(this Commentary item) { + if (item == null) return null; CommentaryDTO commentary = new CommentaryDTO(); commentary.Id = item.Id; commentary.Date = item.DateCommentary; @@ -56,6 +58,7 @@ namespace Dto2Entities // Surement a refaire car Faoirite Entity modifier sur branche EF public static FavoriteDTO ToDto(this Favorite item) { + if (item == null) return null; FavoriteDTO favorite = new FavoriteDTO(); favorite.IdUser = item.IdUsers; favorite.IdQuote = item.IdQuote; @@ -74,6 +77,7 @@ namespace Dto2Entities public static ImageDTO ToDto(this Images item) { + if (item == null) return null; ImageDTO image = new ImageDTO(); image.IdImage = item.Id; image.ImagePath = item.ImgPath; @@ -92,6 +96,7 @@ namespace Dto2Entities public static QuestionDTO ToDto(this Question item) { + if (item == null) return null; QuestionDTO question = new QuestionDTO(); question.Id = item.Id; question.Question = item.Text; @@ -115,6 +120,7 @@ namespace Dto2Entities public static QuizDTO ToDto(this Quiz item) { + if (item == null) return null; QuizDTO quiz = new QuizDTO(); quiz.Id = item.Id; quiz.NbQuestion = item.NbQuestion; @@ -134,8 +140,9 @@ namespace Dto2Entities } // Surement a refaire car QuizQuestion Entity modifier sur branche EF - public static QuizQuestionDTO ToDto(this QuizQuestion item) - { + public static QuizQuestionDTO ToDto(this QuizQuestion item) + { + if (item == null) return null; QuizQuestionDTO quizQuestion = new QuizQuestionDTO(); quizQuestion.IdQuiz = item.IdQuiz; quizQuestion.IdQuestion = item.IdQuestion; @@ -154,6 +161,7 @@ namespace Dto2Entities public static QuoteDTO ToDto(this Quote item) { + if (item == null) return null; QuoteDTO quote = new QuoteDTO(); quote.Id = item.Id; quote.Content = item.Content; @@ -180,6 +188,7 @@ namespace Dto2Entities public static SourceDTO ToDto(this Source item) { + if (item == null) return null; SourceDTO source = new SourceDTO(); source.Id = item.Id; source.Date = item.Year; @@ -200,6 +209,7 @@ namespace Dto2Entities public static UserDTO ToDto(this Users item) { + if (item == null) return null; UserDTO user = new UserDTO(); user.Id = item.Id; user.Pseudo = item.UserName; @@ -247,6 +257,7 @@ namespace Dto2Entities public static Character ToEntity(this CharacterDTO item) { + if (item == null) return null; Character character = new Character(); character.Id = item.Id; character.Name = item.Name; @@ -266,6 +277,7 @@ namespace Dto2Entities public static Commentary ToEntity(this CommentaryDTO item) { + if (item == null) return null; Commentary commentary = new Commentary(); commentary.Id = item.Id; commentary.DateCommentary = item.Date; @@ -288,6 +300,7 @@ namespace Dto2Entities // Surement a refaire car Faoirite Entity modifier sur branche EF public static Favorite ToEntity(this FavoriteDTO item) { + if (item == null) return null; Favorite favorite = new Favorite(); favorite.IdUsers = item.IdUser; favorite.IdQuote = item.IdQuote; @@ -306,6 +319,7 @@ namespace Dto2Entities public static Images ToEntity(this ImageDTO item) { + if (item == null) return null; Images image = new Images(); image.Id = item.IdImage; image.ImgPath = item.ImagePath; @@ -324,6 +338,7 @@ namespace Dto2Entities public static Question ToEntity(this QuestionDTO item) { + if (item == null) return null; Question question = new Question(); question.Id = item.Id; question.Text = item.Question; @@ -346,6 +361,7 @@ namespace Dto2Entities public static Quiz ToEntity(this QuizDTO item) { + if (item == null) return null; Quiz quiz = new Quiz(); quiz.Id = item.Id; quiz.NbQuestion = item.NbQuestion; @@ -367,6 +383,7 @@ namespace Dto2Entities // Surement a refaire car QuizQuestion Entity modifier sur branche EF public static QuizQuestion ToEntity(this QuizQuestionDTO item) { + if (item == null) return null; QuizQuestion quizQuestion = new QuizQuestion(); quizQuestion.IdQuiz = item.IdQuiz; quizQuestion.IdQuestion = item.IdQuestion; @@ -385,6 +402,7 @@ namespace Dto2Entities public static Quote ToEntity(this QuoteDTO item) { + if (item == null) return null; Quote quote = new Quote(); quote.Id = item.Id; quote.Content = item.Content; @@ -414,6 +432,7 @@ namespace Dto2Entities public static Source ToEntity(this SourceDTO item) { + if (item == null) return null; Source source = new Source(); source.Id = item.Id; source.Year = item.Date; @@ -434,6 +453,7 @@ namespace Dto2Entities public static Users ToEntity(this UserDTO item) { + if (item == null) return null; Users user = new Users(); user.Id = item.Id; user.UserName = item.Pseudo; diff --git a/WF_EF_Api/ServicesApi/FavoriteService.cs b/WF_EF_Api/ServicesApi/FavoriteService.cs index a2a0030..b68d082 100644 --- a/WF_EF_Api/ServicesApi/FavoriteService.cs +++ b/WF_EF_Api/ServicesApi/FavoriteService.cs @@ -43,7 +43,7 @@ namespace ServicesApi await favoriteService.RemoveFavorite(quoteid, userId); } - public async Task GetFavorite(int userId, int idQuote) + public async Task GetFavorite(int userId, int idQuote) { return (await favoriteService.GetFavorite(userId,idQuote) ).ToDto(); } diff --git a/WF_EF_Api/WfApi/Controllers/FavoriteControleur.cs b/WF_EF_Api/WfApi/Controllers/FavoriteController.cs similarity index 79% rename from WF_EF_Api/WfApi/Controllers/FavoriteControleur.cs rename to WF_EF_Api/WfApi/Controllers/FavoriteController.cs index 7ef8a7c..20ca251 100644 --- a/WF_EF_Api/WfApi/Controllers/FavoriteControleur.cs +++ b/WF_EF_Api/WfApi/Controllers/FavoriteController.cs @@ -9,12 +9,12 @@ namespace WfApi.Controllers { [ApiController] [Route("api/v1/favorite")] //Version API - public class FavoriteControleur : ControllerBase + public class FavoriteController : ControllerBase { private readonly IFavoriteService _favorite; - private readonly ILogger _logger; - public FavoriteControleur(IFavoriteService favoriteService, ILogger logger) + private readonly ILogger _logger; + public FavoriteController(IFavoriteService favoriteService, ILogger logger) { _favorite = favoriteService; _logger = logger; @@ -22,12 +22,33 @@ namespace WfApi.Controllers - [HttpGet("{id}")] // Indiquer que l'id est dans l'URL - public async Task GetFavoriteByIdUser(int id, int index = 0, int count = 10) + [HttpGet("{idUser}")] // Indiquer que l'id est dans l'URL + public async Task GetFavoriteByIdUser(int idUser, int index = 0, int count = 10) { try { - var result = await _favorite.GetFavoriteByIdUser(id, index, count); + var result = await _favorite.GetFavoriteByIdUser(idUser, index, count); + + if (result != null) + { + return await Task.FromResult(Ok(result)); + } + else + { + return NoContent(); + } + } + catch (Exception) + { + return StatusCode((int)HttpStatusCode.InternalServerError, new { message = "Internal Server Error" }); + } + } + [HttpGet()] // Indiquer que l'id est dans l'URL + public async Task GetFavoriteByIdUser(int idUser , int idQuote) + { + try + { + var result = await _favorite.GetFavorite(idUser, idQuote); if (result != null) { diff --git a/WF_EF_Api/WfApi/Program.cs b/WF_EF_Api/WfApi/Program.cs index 24338f1..71bbd5b 100644 --- a/WF_EF_Api/WfApi/Program.cs +++ b/WF_EF_Api/WfApi/Program.cs @@ -26,6 +26,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped, DbUsersManager>(); builder.Services.AddScoped, DbQuoteManager>(); +builder.Services.AddScoped, DbFavoriteManager>(); builder.Services.AddScoped, DbCommentaryManager>(); builder.Services.AddScoped, DbCharacterManager>(); builder.Services.AddScoped, DbImagesManager>();