using System.Security.Cryptography.X509Certificates;
using SchoolContracts.BindingModels;
using SchoolContracts.SearchModels;
using SchoolContracts.StoragesContracts;
using SchoolContracts.ViewModels;
using SchoolDatabaseImplement.Models;
using Microsoft.EntityFrameworkCore;
namespace SchoolDatabaseImplement.Implements
{
public class DisciplineStorage : IDisciplineStorage
{
private void CheckSearchModel(DisciplineSearchModel model)
{
if (model == null)
throw new ArgumentNullException("Передаваемая модель для поиска равна нулю", nameof(model));
if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && model.ClientsIds == null)
throw new ArgumentException("Все передаваемые поля поисковой модели оказались пусты или равны null");
if (model.DateFrom.HasValue != model.DateTo.HasValue)
throw new ArgumentException($"Не указано начало {model.DateFrom} или конец {model.DateTo} периода для поиска по дате.");
}
public DisciplineViewModel? Delete(DisciplineBindingModel model)
{
using var context = new SchoolDB();
var element = context.Disciplines.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
context.Disciplines.Remove(element);
context.SaveChanges();
return element;
}
return null;
}
///
/// Получение списка счетов по клиенту и дисциплине, для получения полной и оплаченной стоимости в бизнес логике
///
public List GetAccountsFromDisciplineAndClient(DisciplineSearchModel modelDiscipline, StudentSearchModel modelStudent)
{
if (!modelDiscipline.Id.HasValue)
{
throw new ArgumentNullException(nameof(modelDiscipline), "Получена поисковая модель без Id");
}
if (!modelStudent.Id.HasValue)
{
throw new ArgumentNullException(nameof(modelStudent), "Получена поисковая модель без Id");
}
using var context = new SchoolDB();
var studentByDiscipline = context.StudentsByDisciplines
.Include(x => x.Accounts)
.FirstOrDefault(x => x.ClientId == modelStudent.Id && x.DisciplineId == modelDiscipline.Id);
if (studentByDiscipline?.Accounts == null)
{
throw new InvalidOperationException(
$"Не существует связи между данным учеников(Id={modelStudent.Id}) и (Id={modelDiscipline.Id})");
}
return studentByDiscipline.Accounts.Select(account => (AccountViewModel)account).ToList();
}
public DisciplineViewModel? GetElement(DisciplineSearchModel model)
{
using var context = new SchoolDB();
if (!model.Id.HasValue)
{
return null;
}
return context.Disciplines
.Include(x => x.Student)
.Include(x => x.Students)
.FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id);
}
public List GetFilteredList(DisciplineSearchModel model)
{
CheckSearchModel(model);
if (model.Id.HasValue)
{
var res = GetElement(model);
return res != null ? new() { res } : new();
}
using var context = new SchoolDB();
var query = context.Disciplines.Include(x => x.Student);
IQueryable? resultQuery = null;
if (model.ImplementerId.HasValue)
{
return query
.Where(x => model.ImplementerId == x.ImplementerId)
.Select(x => (DisciplineViewModel)x)
.ToList();
}
if (model.DateTo.HasValue)
resultQuery = query
.Include(x => x.Students)
.ThenInclude(x => x.Student)
.Include(x => x.Requirements)
.ThenInclude(x => x.Requirement)
.Where(x => model.DateFrom <= x.DateOfReceipt && x.DateOfReceipt <= model.DateTo);
else if (model.StudentsIds != null)
resultQuery = query
.Include(x => x.Students)
.ThenInclude(x => x.Student)
.Where(x => x.Clients.Any(x => model.StudentsIds.Contains(x.StudentId)));
return resultQuery?
.Select(x => (DisciplineViewModel)x)
.ToList() ?? new();
}
public List GetFullList()
{
using var context = new SchoolDB();
return context.Disciplines
.Include(x => x.Student)
.Include(x => x.Students)
.Select(x => (DisciplineViewModel)x)
.ToList();
}
public DisciplineViewModel? Insert(DisciplineBindingModel model)
{
var newDiscipline = Discipline.Create(model);
if (newDiscipline == null)
{
return null;
}
using var context = new SchoolDB();
context.Disciplines.Add(newDiscipline);
context.SaveChanges();
newDiscipline.UpdateClients(context, model);
context.SaveChanges();
return newDiscipline;
}
public DisciplineViewModel? Update(DisciplineBindingModel model)
{
using var context = new SchoolDB();
var disciplinevisit = context.Disciplines.FirstOrDefault(x => x.Id == model.Id);
if (disciplinevisit == null)
{
return null;
}
disciplinevisit.Update(model);
disciplinevisit.UpdateClients(context, model);
context.SaveChanges();
return disciplinevisit;
}
}
}