150 lines
3.3 KiB
JavaScript
150 lines
3.3 KiB
JavaScript
// import {collection} from '../core/db'
|
|
// const {collection} = require('../core/db')
|
|
import {createMap} from '../utils/common'
|
|
import {getCollective} from './collective'
|
|
|
|
import {scheduleDate, getPeriod as schedulePeriod, getPeriodString} from '../models/schedule'
|
|
import {getCourse} from '../models/course'
|
|
|
|
const last = require('../lib/array').last
|
|
const sortBy = require('../lib/sort').sortBy
|
|
|
|
const SCHEDULES = 'schedules'
|
|
|
|
export async function findSchedule(collection, period, semester) {
|
|
const schedule = await collection(SCHEDULES).findOne({
|
|
$or: [
|
|
{period: period},
|
|
{period: schedulePeriod(period)}
|
|
],
|
|
semester: semester
|
|
})
|
|
|
|
return schedule ? migrate(schedule) : null
|
|
}
|
|
|
|
async function findAllScheduleParams() {
|
|
const schedules = await collection(SCHEDULES)
|
|
.find({}, {
|
|
period: 1,
|
|
semester: 1,
|
|
_id: 0,
|
|
})
|
|
.toArray()
|
|
|
|
return schedules
|
|
.map(i => ({
|
|
...i,
|
|
period: schedulePeriod(i.period),
|
|
}))
|
|
.sort(sortBy(
|
|
i => scheduleDate(i).getTime(),
|
|
true,
|
|
))
|
|
}
|
|
|
|
async function findDefaultScheduleParams() {
|
|
const schedules = await findAllScheduleParams()
|
|
return last(schedules
|
|
.map(i => ({
|
|
...i,
|
|
period: getPeriodString(i.period),
|
|
}))
|
|
)
|
|
}
|
|
|
|
function text({semester, period}) {
|
|
const word = semester => [['spring', 'Весна'], ['autumn', 'Осень']]
|
|
.find(i => i[0] === semester)
|
|
[1]
|
|
const periodIndex = semester === 'spring' ? 1 : 0
|
|
const year = period[periodIndex]
|
|
|
|
return `${word(semester)} ${year} года`
|
|
}
|
|
|
|
async function migrate(schedule) {
|
|
const versions = {
|
|
'1.0': migrate10to20,
|
|
'2.0': migrate20to30,
|
|
}
|
|
|
|
const version = schedule.version
|
|
const update = versions[version]
|
|
return version in versions ? migrate(update(schedule)) : schedule
|
|
}
|
|
|
|
function migrate10to20(schedule) {
|
|
const dayNames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
|
|
const time = time => time
|
|
.map(i => i.split(' '))
|
|
|
|
const week = days => days.reduce((week, lesson, index) => {
|
|
if (lesson) {
|
|
const day = dayNames[index]
|
|
week[day] = [Object.assign(lesson, {
|
|
time: time(lesson.time)
|
|
})]
|
|
}
|
|
|
|
return week
|
|
}, {})
|
|
|
|
return Object.assign(schedule, {
|
|
version: '2.0',
|
|
period: schedulePeriod(schedule.period),
|
|
groups: schedule.schedule
|
|
.map(group => ({
|
|
name: group.group,
|
|
time: group.time,
|
|
week: week(group.week)
|
|
}))
|
|
})
|
|
}
|
|
|
|
async function migrate20to30(schedule) {
|
|
const days = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat']//, 'sun']
|
|
|
|
const persons = await getCollective()
|
|
const person = createMap(i => i.id, persons)
|
|
|
|
const week = week => days
|
|
.map(day => week[day] || [])
|
|
.map(lessons => lessons.map(lesson))
|
|
|
|
const lesson = i => ({
|
|
time: i.time,
|
|
course: getCourse(i.lesson),
|
|
teacher: person.has(i.teacher) ? teacher(i.teacher) : teacherDummy(i.teacher)
|
|
})
|
|
|
|
const teacher = id => ({
|
|
id: id,
|
|
url: `/teacher/${id}`,
|
|
name: personName(id)
|
|
})
|
|
|
|
const teacherDummy = name => ({
|
|
id: name,
|
|
url: null,
|
|
name: name
|
|
})
|
|
|
|
const personName = id => person.has(id) ? person.get(id).name : null
|
|
|
|
return Object.assign(schedule, {
|
|
version: '3.0',
|
|
groups: schedule.groups
|
|
.map(group => ({
|
|
name: group.name,
|
|
time: group.time,
|
|
week: week(group.week)
|
|
}))
|
|
})
|
|
}
|
|
|
|
// exports.findSchedule = findSchedule
|
|
// exports.findAllScheduleParams = findAllScheduleParams
|
|
// exports.findDefaultScheduleParams = findDefaultScheduleParams
|
|
// exports.text = text
|