/// <summary>Returns back the student information from their WVUP Id and email</summary> public async Task <PersonInfoDTO> GetPersonInfo(string identifier) { var person = await personRepo.Find(x => x.Email == identifier || x.Id.ToString() == identifier); var bannerInfo = await bannerApi.GetBannerInfo(identifier); var hasSchedule = await scheduleRepo.Exist(x => person is Person && x.SemesterCode == bannerInfo.TermCode && x.PersonId == person.Id); // if person has a schedule, just return their schedule if (person is Person && hasSchedule) { var schedule = scheduleRepo.GetAll(x => x.PersonId == person.Id).Select(x => x.Class); return(new PersonInfoDTO() { Id = person.Id, Email = person.Email, FirstName = person.FirstName, LastName = person.LastName, PersonType = person.PersonType, Schedule = schedule }); } var newPerson = new Person() { Email = bannerInfo.EmailAddress, FirstName = bannerInfo.FirstName, LastName = bannerInfo.LastName, Id = bannerInfo.WVUPID, PersonType = bannerInfo.Teacher ? PersonType.Teacher : PersonType.Student }; var savedPerson = await personRepo.CreateOrUpdate(x => x.Id == newPerson.Id, newPerson); var semester = new Semester() { Code = bannerInfo.TermCode }; var savedSemester = await semesterRepo.CreateOrUpdate(x => x.Code == semester.Code, semester); // Done if person is a teacher if (savedPerson.PersonType == PersonType.Teacher) { return(new PersonInfoDTO() { Id = savedPerson.Id, Email = savedPerson.Email, FirstName = savedPerson.FirstName, LastName = savedPerson.LastName, PersonType = savedPerson.PersonType }); } var departments = bannerInfo.Courses.Select(x => x.Department).Select(x => new Department() { Code = x.Code, Name = x.Name }); foreach (var d in departments) { await departmentRepo.CreateOrUpdate(x => x.Code == d.Code, d); } var courses = bannerInfo.Courses.Select(x => new Class() { CRN = x.CRN, Name = x.CourseName, ShortName = x.ShortName, DepartmentCode = x.Department.Code }); foreach (var c in courses) { await classRepo.CreateOrUpdate(x => x.CRN == c.CRN, c); await scheduleRepo.CreateOrUpdate(x => x.PersonId == savedPerson.Id && x.SemesterCode == bannerInfo.TermCode && x.ClassCRN == c.CRN, new Schedule() { SemesterCode = bannerInfo.TermCode, PersonId = savedPerson.Id, ClassCRN = c.CRN }); } return(new PersonInfoDTO() { Id = savedPerson.Id, Email = savedPerson.Email, FirstName = savedPerson.FirstName, LastName = savedPerson.LastName, PersonType = savedPerson.PersonType, Schedule = courses }); }