You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.01-QCM_MuscuMaths/WebApi/EntityManagers/AnswerEntityManager.cs

131 lines
4.8 KiB

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<AnswerEntity>
{
private MyDbContext dbContext;
public AnswerEntityManager(MyDbContext dbContext)
{
this.dbContext = dbContext;
}
public async Task<AnswerEntity> 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<AnswerEntity?> getAnswer(int id)
{
return await dbContext.Answers.Where(a => a.Id == id).FirstOrDefaultAsync();
}
public async Task<(int nbPages, IEnumerable<AnswerEntity>? 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<AnswerEntity>? answers
)> ((
nbPages,
null
));
}
var tmp = dbContext.Answers;
IQueryable<AnswerEntity> 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<AnswerEntity>? answers
)> ((
nbPages,
tmp2.Skip((page - 1) * count).Take(count)
));
}
public async Task<IEnumerable<AnswerEntity>?> getAnswersByIdQuestion(int id)
{
if(dbContext.Questions.Where(q => q.Id == id).Any())
{
return await Task.FromResult<IEnumerable<AnswerEntity>?>(dbContext.Answers.Where(a => a.IdQuestion == id));
}
return await Task.FromResult<IEnumerable<AnswerEntity>?>(null);
}
public int getNbAnswers()
{
return dbContext.Answers.CountAsync().Result;
}
public async Task<AnswerEntity?> removeAnswer(int id)
{
var tmp = getAnswer(id).Result;
if (tmp == null) return await Task.FromResult<AnswerEntity?>(tmp);
dbContext.Answers.Remove(tmp);
await dbContext.SaveChangesAsync();
return await Task.FromResult<AnswerEntity?>(tmp);
}
public async Task<AnswerEntity?> removeAnswer(AnswerEntity answer)
{
var tmp = dbContext.Answers.Where(a => a.Equals(answer)).FirstOrDefaultAsync().Result;
if (tmp == null) return await Task.FromResult<AnswerEntity?>(tmp);
dbContext.Answers.Remove(tmp);
await dbContext.SaveChangesAsync();
return await Task.FromResult<AnswerEntity?>(tmp);
}
public async Task<AnswerEntity?> 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;
}
}
}