using iknow_api.Data;
using iknow_api.Models;
using Microsoft.EntityFrameworkCore;
namespace iknow_api.Repositories
{
public class ProfRepository : IProfRepository
{
private readonly AppDbContext _context;
public ProfRepository(AppDbContext context)
{
_context = context;
}
///
/// A professor teaches a subject for a given enrolment, so the students
/// are reached through semesters_subjects.professor_id and the student
/// through the enrolment - matching the ER model, which does not link
/// SemestersSubjects to a student directly.
///
private IQueryable TaughtBy(int professorId) =>
_context.SemesterSubjects
.Where(ss => ss.ProfessorId == professorId)
.Include(ss => ss.Subject)
.Include(ss => ss.PassedSubject)
.Include(ss => ss.EnrolledSemester!)
.ThenInclude(es => es.User)
.Include(ss => ss.EnrolledSemester!)
.ThenInclude(es => es.Semester);
public async Task> GetTaughtSemesterSubjectsAsync(int professorId) =>
await TaughtBy(professorId)
.AsNoTracking()
.AsSplitQuery()
.ToListAsync();
public async Task FindTaughtSemesterSubjectAsync(
int professorId, int studentId, int subjectId)
{
var candidates = await TaughtBy(professorId)
.Where(ss => ss.SubjectId == subjectId
&& ss.EnrolledSemester!.UserId == studentId)
.AsSplitQuery()
.ToListAsync();
// Most recent enrolment first. Semesters are labelled Year/Year+1
// throughout the app, so within one year summer follows winter.
return candidates
.OrderByDescending(ss => ss.EnrolledSemester!.Semester!.Year)
.ThenByDescending(ss => ss.EnrolledSemester!.Semester!.Type == sType.summer)
.FirstOrDefault();
}
public async Task GetPassedSubjectAsync(int semesterSubjectId) =>
await _context.PassedSubjects
.FirstOrDefaultAsync(ps => ps.SemesterSubjectId == semesterSubjectId);
public async Task AddPassedSubjectAsync(PassedSubject passed)
{
_context.PassedSubjects.Add(passed);
await _context.SaveChangesAsync();
}
public async Task UpdatePassedSubjectAsync(PassedSubject passed)
{
_context.PassedSubjects.Update(passed);
await _context.SaveChangesAsync();
}
public async Task RemovePassedSubjectAsync(PassedSubject passed)
{
_context.PassedSubjects.Remove(passed);
await _context.SaveChangesAsync();
}
}
}