import { IParserResultBase } from "../IParserResult"; import * as dto from "@rolesvillesoftware/tiberhealthmodel/dto"; import { mySqlConnection } from "@rolesvillesoftware/tiberhealthmodel"; export class ExamResultSummary { public exam: dto.Exam; public students: dto.Student[]; public studentEmails: dto.StudentEmail[]; public questions: dto.Question[]; public categories: dto.Category[]; private _courses: dto.Course[]; private _assessments: dto.Assessment[]; public examFact: dto.ExamFact[]; public questionFact: dto.QuestionFact[]; public examQuestionFact: dto.ExamQuestionFact[]; public categoryFact: dto.CategoryFact[]; get courses(): dto.Course[] { return this._courses; } set courses(v: dto.Course[]) { this._courses = v; if (this._courses != null && this._courses.length === 1) { this.exam.course = this._courses[0]; } else { this.exam.course = null; } } get assessments(): dto.Assessment[] { return this._assessments; } set assessments(v: dto.Assessment[]) { this._assessments = v; if (this._assessments != null && this._assessments.length === 1) { this.exam.assessment = this._assessments[0]; } else { this.exam.assessment = null; this._assessments = null; } } constructor() { } private saveDimTables(connection: mySqlConnection): Promise { return Promise.all( [ Promise.all(this.courses.map(course => course.getOrCreate(connection))), Promise.all(this.students.map(student => student.getOrCreate(connection))), Promise.all(this.questions.map(question => question.getOrCreate(connection))), Promise.all(this.assessments.map(assessment => assessment.getOrCreate(connection))), dto.Category.save(connection, this.categories) ] ) } public cleanFactTables(connection: mySqlConnection): Promise { return Promise.all( [ dto.ExamFact.ClearExamFact(this.exam, connection), dto.QuestionFact.ClearQuestionFact(this.exam, connection), dto.ExamQuestionFact.ClearExamQuestionFact(this.exam, connection), dto.CategoryFact.ClearCategoryFact(this.exam, connection) ] ); } public saveFactTables(connection: mySqlConnection): Promise { return Promise.all( [ Promise.all(this.examFact.map(exam => exam.create(connection))), Promise.all(this.questionFact.map(question => question.create(connection))), Promise.all(this.examQuestionFact.map(question => question.create(connection))), Promise.all(this.categoryFact.map(category => category.create(connection))) ] ); } public validateSave(): string[] { const messages = new Array(0); if (this.courses == null) { messages.push("No course defined in import file"); } if (this.courses != null && this.courses.length > 1) { messages.push("More than one course presented in file."); } if (this.exam.course == null) { messages.push("Exam is not assigned to a course"); } if (this.assessments == null) { messages.push("No assessments defined in import file"); } if (this.assessments != null && this.assessments.length > 1) { messages.push("More than one assessment presented in import file"); } if (this.exam.assessment == null) { messages.push("Exam is not assigned to an assessment"); } if (this.studentEmails == null || this.studentEmails.length === 0) { messages.push("No e-mails defined in import file"); } if (this.studentEmails != null && this.students != null && this.students.length !== this.studentEmails.length) { messages.push("E-mail count does not match student count - missing or duplicate e-mail addresses"); } return messages; } public saveToDb(connection: mySqlConnection): Promise { return new Promise( (response, reject) => { this.exam.dateUploaded = new Date(); this.exam.updateOrCreate(connection) .then(_ => this.saveDimTables(connection) .then(_ => dto.StudentEmail.save(connection, this.studentEmails, this.students) .then(_ => this.cleanFactTables(connection) .then(_ => this.saveFactTables(connection) .then(_ => { this.exam.effStatus = "A"; this.exam.importMessage = "Imported Successfully"; this.exam.updateOrCreate(connection) .then(_ => response({})) .catch(error => { reject(error); }); }) .catch(error => { reject(error); }) ) .catch(error => { reject(error); }) ) .catch(error => { reject(error); }) ) .catch(error => { reject(error); }) ) .catch(error => { reject(error); }) }); } }