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 : IAnswerManager { private MyDbContext dbContext; public AnswerEntityManager(MyDbContext dbContext) { this.dbContext = dbContext; } public async Task addAnswer(AnswerEntity answer) { var tmp = await dbContext.Answers.Where(a => a.Content == answer.Content.ToLower() && a.IdQuestion == answer.IdQuestion).FirstOrDefaultAsync(); if (tmp != null) // <=> he already exist { return tmp!; } await dbContext.Answers.AddAsync(new AnswerEntity { Content = answer.Content.ToLower(), IdQuestion = answer.IdQuestion }); await dbContext.SaveChangesAsync(); return await dbContext.Answers.Where(a => a.Content == answer.Content.ToLower() && a.IdQuestion == answer.IdQuestion).FirstAsync(); } public async Task getAnswer(int id) { return await dbContext.Answers.Where(a => a.Id == id).FirstOrDefaultAsync(); } public async Task<(int nbPages, IEnumerable? answers)> getAnswers(int page, int count, AnswerOrderCriteria orderCriteria = AnswerOrderCriteria.ById) { int nbEl = getNbAnswers(); float nbPageFloat = count == 0 ? -1 : (float)nbEl / count; int nbPages = (int)nbPageFloat; if (nbPages != nbPageFloat) nbPages++; if (page <= 0 || count <= 0 || (page-1)*count >= nbEl) { return await Task.FromResult<( int nbPages, IEnumerable? answers )> (( nbPages, null )); } var tmp = dbContext.Answers; IQueryable tmp2; switch (orderCriteria) { case AnswerOrderCriteria.ById: tmp2 = tmp.OrderBy(a => a.Id); break; case AnswerOrderCriteria.ByContent: tmp2 = tmp.OrderBy(a => a.Content); break; case AnswerOrderCriteria.ByIdQuestion: tmp2 = tmp.OrderBy(a => a.IdQuestion); break; default: tmp2 = tmp; break; } return await Task.FromResult<( int nbPages, IEnumerable? answers )> (( nbPages, tmp2.Skip((page - 1) * count).Take(count) )); } public async Task?> getAnswersByIdQuestion(int id) { if(dbContext.Questions.Where(q => q.Id == id).Any()) { return await Task.FromResult?>(dbContext.Answers.Where(a => a.IdQuestion == id)); } return await Task.FromResult?>(null); } public int getNbAnswers() { return dbContext.Answers.CountAsync().Result; } public async Task removeAnswer(int id) { var tmp = getAnswer(id).Result; if (tmp == null) return await Task.FromResult(tmp); dbContext.Answers.Remove(tmp); await dbContext.SaveChangesAsync(); return await Task.FromResult(tmp); } public async Task removeAnswer(AnswerEntity answer) { var tmp = dbContext.Answers.Where(a => a.Equals(answer)).FirstOrDefaultAsync().Result; if (tmp == null) return await Task.FromResult(tmp); dbContext.Answers.Remove(tmp); await dbContext.SaveChangesAsync(); return await Task.FromResult(tmp); } public async Task updateAnswer(int id, AnswerEntity answer) { var tmp = await getAnswer(id); if(tmp == null) { return null; } tmp.Content = answer.Content; tmp.Question = answer.Question; tmp.IdQuestion = answer.IdQuestion; await dbContext.SaveChangesAsync(); return tmp; } } }