diff --git a/WebApi/EntityManagers/AdministratorEntityManager.cs b/WebApi/EntityManagers/AdministratorEntityManager.cs new file mode 100644 index 0000000..dee43f4 --- /dev/null +++ b/WebApi/EntityManagers/AdministratorEntityManager.cs @@ -0,0 +1,81 @@ +using DbConnectionLibrairie; +using Entities; +using ManagerInterfaces; +using Microsoft.EntityFrameworkCore; +using OrderCriterias; +using ExtensionsClassLibrairie; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EntityManagers +{ + public class AdministratorEntityManager(MyDbContext dbContext) : IAdministratorManager + { + private MyDbContext dbContext = dbContext; + + public Task addAdmin(AdministratorEntity admin) + { + dbContext.Administrators.Add(admin); + dbContext.SaveChangesAsync(); + return dbContext.Administrators.Where(a => a.Equals(admin)).FirstAsync(); + } + + public Task getAdministratorByUsername(string username) + { + return dbContext.Administrators.Where(a => a.Username == username).FirstOrDefaultAsync(); + } + + public Task<(int nbPages, IEnumerable? administrators)> getAdministrators(int nb, int count, AdministratorOrderCriteria orderCriteria = AdministratorOrderCriteria.ById) + { + int nbEl = getNbElements(); + if(nb > nbEl/count) return Task.FromResult<(int nbPages, IEnumerable? administrators)>((nbEl/count, null)); + var tmp = dbContext.Administrators; + switch (orderCriteria) + { + case AdministratorOrderCriteria.ById: + tmp.OrderBy(a => a.Id); + break; + case AdministratorOrderCriteria.ByUserName: + tmp.OrderBy(a => a.Username); + break; + } + return Task.FromResult<(int nbPages, IEnumerable? administrators)>((nbEl/count, tmp.Skip((nb-1)*count).Take(count))); + } + + public int getNbElements() + { + return dbContext.Administrators.CountAsync().Result; + } + + public Task removeAdmin(AdministratorEntity admin) + { + var tmp = dbContext.Administrators.Where(a => a.Equals(admin)).FirstOrDefaultAsync().Result; + if(tmp == null) return Task.FromResult(tmp); + dbContext.Administrators.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + + public Task removeAdmin(int id) + { + var tmp = dbContext.Administrators.Where(a => a.Id == id).FirstOrDefaultAsync().Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Administrators.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + + public Task setPassword(string username, string newHashedPassword) + { + var tmp = getAdministratorByUsername(username).Result; + if (tmp == null) return Task.FromResult(false); + tmp.HashedPassword = newHashedPassword; + dbContext.SaveChanges(); + return Task.FromResult(true); + } + } +} diff --git a/WebApi/EntityManagers/AnswerEntityManager.cs b/WebApi/EntityManagers/AnswerEntityManager.cs new file mode 100644 index 0000000..86a6085 --- /dev/null +++ b/WebApi/EntityManagers/AnswerEntityManager.cs @@ -0,0 +1,88 @@ +using DbConnectionLibrairie; +using Entities; +using ManagerInterfaces; +using Microsoft.EntityFrameworkCore; +using OrderCriterias; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EntityManagers +{ + public class AnswerEntityManager(MyDbContext dbContext) : IAnswerManager + { + private MyDbContext dbContext = dbContext; + + public Task addAnswer(AnswerEntity answer) + { + dbContext.Answers.Add(answer); + dbContext.SaveChangesAsync(); + return dbContext.Answers.Where(a => a.Equals(answer)).FirstAsync(); + } + + public Task getAnswer(uint id) + { + return dbContext.Answers.Where(a => a.Id == id).FirstOrDefaultAsync(); + } + + public Task<(int nbPages, IEnumerable? answers)> getAnswers(int nb, int count, AnswerOrderCriteria orderCriteria = AnswerOrderCriteria.ById) + { + int nbEl = getNbElements(); + if (nb > nbEl / count) return Task.FromResult<(int nbPages, IEnumerable? answers)>((nbEl / count, null)); + var tmp = dbContext.Answers; + switch (orderCriteria) + { + case AnswerOrderCriteria.ById: + tmp.OrderBy(a => a.Id); + break; + case AnswerOrderCriteria.ByContent: + tmp.OrderBy(a => a.Content); + break; + case AnswerOrderCriteria.ByIdQuestion: + tmp.OrderBy(a => a.IdQuestion); + break; + } + return Task.FromResult<(int nbPages, IEnumerable? answers)>((nbEl / count, tmp.Skip((nb - 1) * count).Take(count))); + } + + public Task?> getAnswersByIdQuestion(uint id) + { + if(dbContext.Questions.Where(q => q.Id == id).Any()) + { + return Task.FromResult?>(dbContext.Answers.Where(a => a.IdQuestion == id)); + } + return Task.FromResult?>(null); + } + + public int getNbElements() + { + return dbContext.Answers.CountAsync().Result; + } + + public Task removeAnswer(uint id) + { + var tmp = getAnswer(id).Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Answers.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + + public Task removeAnswer(AnswerEntity answer) + { + var tmp = dbContext.Answers.Where(a => a.Equals(answer)).FirstOrDefaultAsync().Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Answers.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + + public Task updateAnswer(uint id, AnswerEntity answer) + { + throw new NotImplementedException(); + } + } +} diff --git a/WebApi/EntityManagers/ChapterEntityManager.cs b/WebApi/EntityManagers/ChapterEntityManager.cs new file mode 100644 index 0000000..66a9e44 --- /dev/null +++ b/WebApi/EntityManagers/ChapterEntityManager.cs @@ -0,0 +1,71 @@ +using DbConnectionLibrairie; +using Entities; +using ManagerInterfaces; +using Microsoft.EntityFrameworkCore; +using Model; +using OrderCriterias; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EntityManagers +{ + public class ChapterEntityManager(MyDbContext dbContext) : IChapterManager + { + MyDbContext dbContext = dbContext; + + public Task addChapter(ChapterEntity chapter) + { + dbContext.Chapters.Add(chapter); + dbContext.SaveChangesAsync(); + return dbContext.Chapters.Where(a => a.Equals(chapter)).FirstAsync(); + } + + public Task getChapter(uint id) + { + return Task.FromResult(dbContext.Chapters.Where(c => c.Id == id).FirstOrDefault()); + } + + public Task<(int nbPages, IEnumerable? chapters)> getChapters(int nb, int count, ChapterOrderCriteria orderCriteria = ChapterOrderCriteria.ById) + { + int nbEl = getNbElements(); + if (nb > nbEl / count) return Task.FromResult<(int nbPages, IEnumerable? chapters)>((nbEl / count, null)); + var tmp = dbContext.Chapters; + switch (orderCriteria) + { + case ChapterOrderCriteria.ById: + tmp.OrderBy(a => a.Id); + break; + case ChapterOrderCriteria.ByName: + tmp.OrderBy(a => a.Name); + break; + } + return Task.FromResult<(int nbPages, IEnumerable? chapters)>((nbEl / count, tmp.Skip((nb - 1) * count).Take(count))); + } + + public int getNbElements() + { + return dbContext.Chapters.CountAsync().Result; + } + + public Task removeChapter(ChapterEntity chapter) + { + var tmp = dbContext.Chapters.Where(a => a.Equals(chapter)).FirstOrDefaultAsync().Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Chapters.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + + public Task removeChapter(uint id) + { + var tmp = getChapter(id).Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Chapters.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + } +} diff --git a/WebApi/EntityManagers/EntityManagers.csproj b/WebApi/EntityManagers/EntityManagers.csproj index 9418224..cc5d917 100644 --- a/WebApi/EntityManagers/EntityManagers.csproj +++ b/WebApi/EntityManagers/EntityManagers.csproj @@ -9,6 +9,7 @@ + diff --git a/WebApi/EntityManagers/LobbyEntityManager.cs b/WebApi/EntityManagers/LobbyEntityManager.cs new file mode 100644 index 0000000..2a65850 --- /dev/null +++ b/WebApi/EntityManagers/LobbyEntityManager.cs @@ -0,0 +1,74 @@ +using DbConnectionLibrairie; +using Entities; +using ManagerInterfaces; +using Microsoft.EntityFrameworkCore; +using Model; +using OrderCriterias; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EntityManagers +{ + public class LobbyEntityManager(MyDbContext dbContext) : ILobbyManager + { + MyDbContext dbContext = dbContext; + + public Task addLobby(LobbyEntity lobby) + { + dbContext.Lobbies.Add(lobby); + dbContext.SaveChangesAsync(); + return dbContext.Lobbies.Where(a => a.Equals(lobby)).FirstAsync(); + } + + public Task<(int nbPages, IEnumerable? lobbies)> getLobbies(int nb, int count, LobbyOrderCriteria orderCriteria = LobbyOrderCriteria.ById) + { + int nbEl = getNbElements(); + if (nb > nbEl / count) return Task.FromResult<(int nbPages, IEnumerable? lobbies)>((nbEl / count, null)); + var tmp = dbContext.Lobbies; + switch (orderCriteria) + { + case LobbyOrderCriteria.ById: + tmp.OrderBy(l => l.Id); + break; + case LobbyOrderCriteria.ByName: + tmp.OrderBy(l => l.Name); + break; + case LobbyOrderCriteria.ByNbJoueur: + tmp.OrderBy(l => l.NbPlayers); + break; + } + return Task.FromResult<(int nbPages, IEnumerable? lobbies)>((nbEl / count, tmp.Skip((nb - 1) * count).Take(count))); + } + + public Task getLobby(uint id) + { + return Task.FromResult(dbContext.Lobbies.Where(l => l.Id == id).FirstOrDefault()); + } + + public int getNbElements() + { + return dbContext.Lobbies.CountAsync().Result; + } + + public Task removeLobby(LobbyEntity lobby) + { + var tmp = dbContext.Lobbies.Where(a => a.Equals(lobby)).FirstOrDefaultAsync().Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Lobbies.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + + public Task removeLobby(uint id) + { + var tmp = dbContext.Lobbies.Where(a => a.Id == id).FirstOrDefaultAsync().Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Lobbies.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + } +} diff --git a/WebApi/EntityManagers/PlayerEntityManager.cs b/WebApi/EntityManagers/PlayerEntityManager.cs new file mode 100644 index 0000000..50c20c3 --- /dev/null +++ b/WebApi/EntityManagers/PlayerEntityManager.cs @@ -0,0 +1,96 @@ +using DbConnectionLibrairie; +using Entities; +using ManagerInterfaces; +using Microsoft.EntityFrameworkCore; +using Model; +using OrderCriterias; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EntityManagers +{ + public class PlayerEntityManager(MyDbContext dbContext) : IPlayerManager + { + MyDbContext dbContext = dbContext; + + public Task addPlayer(PlayerEntity player) + { + dbContext.Players.Add(player); + dbContext.SaveChangesAsync(); + return dbContext.Players.Where(a => a.Equals(player)).FirstAsync(); + } + + public Task getMaxScorePlayer(uint id, uint idChapter) + { + var tmp = dbContext.Play.Where(p => p.IdPlayer == id && p.IdChapter == idChapter).FirstOrDefault(); + return Task.FromResult(tmp?.MaxScore); + } + + public Task getMaxScorePlayer(uint id) + { + var tmp = dbContext.Play.Where(p => p.IdPlayer == id).Select(p => p.MaxScore); + if (!tmp.AnyAsync().Result) return Task.FromResult(null); + return Task.FromResult(tmp?.MaxAsync().Result); + } + + public int getNbElements() + { + return dbContext.Players.CountAsync().Result; + } + + public Task getPlayer(uint id) + { + return dbContext.Players.Where(p => p.Id == id).FirstOrDefaultAsync(); + } + + public Task getPlayer(string nickname) + { + return dbContext.Players.Where(p => p.Nickname == nickname).FirstOrDefaultAsync(); + } + + public Task<(int nbPage, IEnumerable? players)> getPlayers(int nb, int count, PlayerOrderCriteria orderCriteria = PlayerOrderCriteria.ById) + { + int nbEl = getNbElements(); + if (nb > nbEl / count) return Task.FromResult<(int nbPages, IEnumerable? players)>((nbEl / count, null)); + var tmp = dbContext.Players; + switch (orderCriteria) + { + case PlayerOrderCriteria.ById: + tmp.OrderBy(p => p.Id); + break; + case PlayerOrderCriteria.ByNickname: + tmp.OrderBy(p => p.Nickname); + break; + } + return Task.FromResult<(int nbPages, IEnumerable? players)>((nbEl / count, tmp.Skip((nb - 1) * count).Take(count))); + } + + public Task?> getPlayersInALobby(uint idLobby) + { + return Task.FromResult?>(dbContext.Use + .Where(u => u.IdLobby == idLobby) + .Select(u => u.Player)); + } + + public Task removePlayer(PlayerEntity player) + { + var tmp = dbContext.Players.Where(p => p.Equals(player)).FirstOrDefaultAsync().Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Players.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + + public Task removePlayer(uint id) + { + var tmp = getPlayer(id).Result; + if (tmp == null) return Task.FromResult(tmp); + dbContext.Players.Remove(tmp); + dbContext.SaveChanges(); + return Task.FromResult(tmp); + } + } +} diff --git a/WebApi/EntityManagers/QuestionEntityManager.cs b/WebApi/EntityManagers/QuestionEntityManager.cs new file mode 100644 index 0000000..3a32056 --- /dev/null +++ b/WebApi/EntityManagers/QuestionEntityManager.cs @@ -0,0 +1,125 @@ +using DbConnectionLibrairie; +using Entities; +using ManagerInterfaces; +using Microsoft.EntityFrameworkCore; +using Model; +using OrderCriterias; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EntityManagers +{ + public class QuestionEntityManager(MyDbContext dbContext) : IQuestionManager + { + private MyDbContext dbContext = dbContext; + + private IQueryable trier(IQueryable query, QuestionOrderCriteria orderCriteria) + { + switch(orderCriteria) + { + case QuestionOrderCriteria.ById: + return query.OrderBy(q => q.Id); + case QuestionOrderCriteria.ByContent: + return query.OrderBy(q => q.Content); + case QuestionOrderCriteria.ByDifficulty: + return query.OrderBy(q => q.Difficulty); + case QuestionOrderCriteria.ByNbFalls: + return query.OrderBy(q => q.NbFalls); + case QuestionOrderCriteria.ByIdChapter: + return query.OrderBy(q => q.Chapter); + } + return query; + } + + public Task addQuestion(QuestionEntity question) + { + dbContext.Questions.Add(question); + dbContext.SaveChangesAsync(); + return dbContext.Questions.Where(q => q.Equals(question)).FirstAsync(); + } + + public Task> addQuestions(IEnumerable questions) + { + var tmp = new List(); + foreach (var q in questions) + { + tmp.Add(addQuestion(q).Result); + } + return Task.FromResult>(tmp); + } + + public int getNbElements() + { + return dbContext.Questions.CountAsync().Result; + } + + public Task getQuestion(uint id) + { + return Task.FromResult(dbContext.Questions.Where(q => q.Id == id).FirstOrDefault()); + } + + public Task<(int nbPages, IEnumerable? questions)> getQuestions(int nb, int count, QuestionOrderCriteria orderCriteria = QuestionOrderCriteria.ById) + { + int nbEl = getNbElements(); + if (nb > nbEl / count) return Task.FromResult<(int nbPages, IEnumerable? questions)>((nbEl / count, null)); + var tmp = trier(dbContext.Questions, orderCriteria); + return Task.FromResult<(int nbPages, IEnumerable? questions)>((nbEl / count, tmp.Skip((nb - 1) * count).Take(count))); + } + + public Task<(int nbPages, IEnumerable? questions)?> getQuestionsByChapterAndDifficulty(int idChapter, int difficulty, int nb, int count, QuestionOrderCriteria orderCriteria = QuestionOrderCriteria.ById) + { + if (!dbContext.Chapters.Where(c => c.Id == idChapter).AnyAsync().Result || difficulty < 1 || difficulty > 3) + return Task.FromResult<(int nbPages, IEnumerable? questions)?>(null); + int nbEl = getNbElements(); + if (nb > nbEl / count) return Task.FromResult<(int nbPages, IEnumerable? questions)?>((nbEl / count, null)); + var tmp = trier(dbContext.Questions, orderCriteria); + return Task.FromResult<(int nbPages, IEnumerable? questions)?>((nbEl / count, tmp.Skip((nb - 1) * count).Take(count))); + } + + public Task removeQuestion(QuestionEntity question) + { + var tmp = dbContext.Questions.Where(q => q.Equals(question)).FirstOrDefaultAsync(); + if (tmp.Result == null) return tmp; + dbContext.Questions.Remove(tmp.Result); + dbContext.SaveChangesAsync(); + return tmp; + } + + public Task removeQuestion(uint id) + { + var tmp = getQuestion(id); + if (tmp.Result == null) return tmp; + dbContext.Questions.Remove(tmp.Result); + dbContext.SaveChangesAsync(); + return tmp; + } + + public Task updateQuestion(uint id, QuestionEntity question) + { + var tmp = getQuestion(id); + if (tmp.Result == null) return tmp; + tmp.Result.Chapter = question.Chapter; + tmp.Result.Content = question.Content; + tmp.Result.IdChapter = question.IdChapter; + tmp.Result.AnswerGood = question.AnswerGood; + tmp.Result.Difficulty = question.Difficulty; + dbContext.SaveChangesAsync(); + return tmp; + } + + public Task updateQuestionNbFalls(uint id) + { + var tmp = getQuestion(id); + if (tmp.Result == null) return tmp; + tmp.Result.NbFalls++; + uint nbFalls = tmp.Result.NbFalls; + if (nbFalls == 50) tmp.Result.Difficulty = 2; + if (nbFalls == 150) tmp.Result.Difficulty = 3; + dbContext.SaveChangesAsync(); + return tmp; + } + } +} diff --git a/WebApi/ManagerInterfaces/IAnswerManager.cs b/WebApi/ManagerInterfaces/IAnswerManager.cs index 09acebe..97111d4 100644 --- a/WebApi/ManagerInterfaces/IAnswerManager.cs +++ b/WebApi/ManagerInterfaces/IAnswerManager.cs @@ -36,7 +36,7 @@ namespace ManagerInterfaces /// /// a set of all T answers that answer to this question /// - public Task?> getAnswersByIdQuestion(uint id); + public Task?> getAnswersByIdQuestion(uint id); /// /// modified a T element with an id /// diff --git a/WebApi/ManagerInterfaces/IPlayerManager.cs b/WebApi/ManagerInterfaces/IPlayerManager.cs index 4d7cba2..f51ef26 100644 --- a/WebApi/ManagerInterfaces/IPlayerManager.cs +++ b/WebApi/ManagerInterfaces/IPlayerManager.cs @@ -62,7 +62,7 @@ namespace ManagerInterfaces /// does not exist (<=> (nb-1)*count outside /// boundaries (0, getNbElement()-1))) /// - public Task<(int nbPage, IEnumerable? players)> getPlayers(int nb, int count, LobbyOrderCriteria orderCriteria = LobbyOrderCriteria.ById); + public Task<(int nbPage, IEnumerable? players)> getPlayers(int nb, int count, PlayerOrderCriteria orderCriteria = PlayerOrderCriteria.ById); /// /// get a player /// @@ -72,7 +72,7 @@ namespace ManagerInterfaces /// or null if no player match /// with this id /// - public Task getPlayer(int id); + public Task getPlayer(uint id); /// /// get a player /// @@ -94,7 +94,7 @@ namespace ManagerInterfaces /// delete the lobby) if it is used by /// no player /// - public Task?> getPlayersInALobby(int idLobby); + public Task?> getPlayersInALobby(uint idLobby); /// /// get the max score of a player in a chapter /// @@ -105,7 +105,7 @@ namespace ManagerInterfaces /// or null if the player or /// the chapter does not exist /// - public Task getMaxScorePlayer(int id, int idChapter); + public Task getMaxScorePlayer(uint id, uint idChapter); /// /// get the global max score of a player /// @@ -114,6 +114,6 @@ namespace ManagerInterfaces /// the max score of the player /// or null if the player does not exist /// - public Task getMaxScorePlayer(int id); + public Task getMaxScorePlayer(uint id); } } diff --git a/WebApi/ManagerInterfaces/IQuestionManager.cs b/WebApi/ManagerInterfaces/IQuestionManager.cs index 5544d80..8a3e3d3 100644 --- a/WebApi/ManagerInterfaces/IQuestionManager.cs +++ b/WebApi/ManagerInterfaces/IQuestionManager.cs @@ -1,5 +1,6 @@ using OrderCriterias; using System; +using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; @@ -92,7 +93,7 @@ namespace ManagerInterfaces /// /// a set of questions to add /// questions added - public Task addQuestions(IEnumerable questions); + public Task> addQuestions(IEnumerable questions); /// /// get a part of all questions for a given chapter and a given difficulty ///