import Colle from '#models/colle' import Examiner from '#models/examiner' import Room from '#models/room' import Subject from '#models/subject' import User from '#models/user' export class ColleService { async getStudent(studentName: string, className: string) { // Find or create a student by name const { firstName, lastName } = this.splitNames(studentName) const student = await User.query() .where('first_name', firstName) .where('last_name', lastName) .where('class_name', className) .first() if (!student) { return User.create({ firstName, lastName, className }) } return student } splitNames(fullName: string): { firstName: string; lastName: string } { const words = fullName.trim().split(/\s+/) let lastNameParts: string[] = [] let i = 0 // Collect all uppercase words at the start while (i < words.length && words[i] === words[i].toUpperCase()) { lastNameParts.push(words[i]) i++ } const lastName = lastNameParts.join(' ') const firstName = words.slice(i).join(' ') return { firstName, lastName } } async getExaminer(examinerName: string) { // Find or create an examiner by name const examiner = await Examiner.query().where('name', examinerName).first() if (!examiner) return Examiner.create({ name: examinerName }) return examiner } async getSubject(subjectName: string) { // Find or create a subject by name const subject = await Subject.query().where('name', subjectName).first() if (!subject) return Subject.create({ name: subjectName }) return subject } async getRoom(roomName: string) { // Find or create a room by name const room = await Room.query().where('name', roomName).first() if (!room) return Room.create({ name: roomName }) return room } async getColles(student: User, startDate: string, endDate: string) { const classColles = await Colle.query() .preload('student') .preload('examiner') .preload('subject') .preload('room') .where('date', '>=', startDate) .where('date', '<=', endDate) .whereHas('student', (query) => { query.where('className', student.className) }) // Filter only colles that have been graded .whereNotNull('grade') .orderBy('date', 'asc') const studentColles = await Colle.query() .preload('examiner') .preload('subject') .preload('room') .preload('student') .where('date', '>=', startDate) .where('date', '<=', endDate) .where('studentId', student.id) .orderBy('date', 'asc') // TODO: Favorite colles const favoriteColles = [] as Colle[] return { classColles, studentColles, favoriteColles, } } }