From f3aaf5a5475db661951cfd3dcdfa6d4b8a5936a0 Mon Sep 17 00:00:00 2001 From: Roman Timashev Date: Thu, 25 Feb 2016 03:29:03 +0300 Subject: [PATCH] core update, schedule router update, schedule populator update, collective update, other --- src/core/collective.js | 9 +++++ src/core/db.js | 4 +++ src/core/schedule.js | 52 +++++++++++++++++++++++++++++ src/models/collective.js | 39 ++++------------------ src/models/course.js | 39 +++++----------------- src/models/schedule.js | 65 +++--------------------------------- src/routes/schedule.js | 71 +++++++++++++--------------------------- src/utils/populate.js | 12 +++---- 8 files changed, 113 insertions(+), 178 deletions(-) create mode 100644 src/core/collective.js create mode 100644 src/core/schedule.js diff --git a/src/core/collective.js b/src/core/collective.js new file mode 100644 index 00000000..f103d8d4 --- /dev/null +++ b/src/core/collective.js @@ -0,0 +1,9 @@ +import {c} from '../core/db'; + +export function* getCollective(query={}, show={}) { + let data = yield c('collective').find(query, show); + if (!data) { + return null; + } + return data; +} \ No newline at end of file diff --git a/src/core/db.js b/src/core/db.js index 415dc137..ab09b3de 100644 --- a/src/core/db.js +++ b/src/core/db.js @@ -16,6 +16,10 @@ module.exports = { }); }, + close: function () { + client.close(); + }, + get db() { return client; }, diff --git a/src/core/schedule.js b/src/core/schedule.js new file mode 100644 index 00000000..959510d2 --- /dev/null +++ b/src/core/schedule.js @@ -0,0 +1,52 @@ +import {c} from '../core/db'; +import {getCollective} from './collective'; + +import {populate} from '../models/schedule'; +import {shortifyName} from '../models/collective'; +import {courses} from '../models/course'; + +export function* getSchedule(period, semester) { + let data = yield c('schedules').findOne({ + period: period, + semester: semester + }); + if (data) return data; + return null; +} + +export function* getScheduleList() { + return yield c('schedules') + .find({}, {period: 1, semester: 1}) + .toArray(); +} + +export function* populateSchedule(schedule) { + let collective = yield getCollective({}, {id: 1, name: 1}); + let collective_dict = collective.reduce((dict, i) => { + dict[i.id] = i.name; + return dict; + }, {}); + + let populateLesson = populate(courses); + let populateTeacher = populate(collective_dict, i => shortifyName(i)); + + return schedule.map(group => { + return { + name: group.name, + time: group.time, + days: group.days.map(record => { + if (!record) return record; + + let lesson = record.lesson; + let teacher = record.teacher; + let time = record.time; + + return { + time: time, + lesson: populateLesson(lesson), + teacher: populateTeacher(teacher) + }; + }) + }; + }); +} \ No newline at end of file diff --git a/src/models/collective.js b/src/models/collective.js index 7b0225d4..d0331a7e 100644 --- a/src/models/collective.js +++ b/src/models/collective.js @@ -1,36 +1,9 @@ -//getPersonByID -export function person(collective, id){ - for(var i=0; i i.replace(/^(.).+/, '$1'); + let [_, first, middle, last] = splitName(name); + return `${$(first)}. ${$(middle)}. ${last}`; } -//getNameByID -export function name(collective, id){ - var p = person(collective, id); - if(p) return p.name; - else return null; -} - -//getShortNameByID -export function short(collective, id){ - var n = name(collective, id); - if(n) return shortifyName(n); - else return null; -} - -export function shortifyName(name){ - var m = splitName(name); - var n = m[1].replace(/^(.).+/, "$1. ") + - m[2].replace(/^(.).+/, "$1. ") + - m[3]; - return n; -} - -export function splitName(name){ - return /(.+)\s(.+)\s(.+)/.exec(name); +export function splitName(name) { + return /(.+)\s(.+)\s(.+)/.exec(name); } \ No newline at end of file diff --git a/src/models/course.js b/src/models/course.js index b38d5288..b2e24bca 100644 --- a/src/models/course.js +++ b/src/models/course.js @@ -1,33 +1,12 @@ -export const courses = [ - { - "id": "painting", - "name": "Живопись" - }, - { - "id": "drawing", - "name": "Рисунок" - }, - { - "id": "sculpting", - "name": "Скульптура" - }, - { - "id": "ceramic", - "name": "Керамика" - }, - { - "id": "composition", - "name": "Композиция" - }, - { - "id": "history", - "name": "История искусства" - }, - { - "id": "cg", - "name": "Комп. графика" - } -]; +export const courses = { + painting: "Живопись", + drawing: "Рисунок", + sculpting: "Скульптура", + ceramic: "Керамика", + composition: "Композиция", + history: "История искусства", + cg: "Комп. графика" +}; export function getCourseByID(id){ for(var i=0; ii) => + record in dict ? map(dict[record]) : record; -const WEEK = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]; - -module.exports = { - populate: populateSchedule -}; - -function populateSchedule(s, pops) { - var days = function (group) { - var result = []; - - WEEK.forEach(function (i) { - var lesson = group[i]; - if (lesson) { - result.push( - pop(lesson) - .populate(time()) - .populate(pops) - .result() - ) - } else { - result.push(null); - } - }); - return result; - }; - - var time = function () { - return function (lesson) { - for (var i = 0; i < lesson.time.length; i++) { - lesson.time[i] = lesson.time[i].replace(" ", "—"); - } - return lesson; - } - }; - - var mondayTime = function (group) { - var day; - for (var i = 0; i < WEEK.length; i++) { - if (group[WEEK[i]]) { - day = WEEK[i]; - break; - } - } - if (day) { - return group[day].time[0].substr(0, 5); - } else { - return "00:00" - } - }; - - var result = []; - s.forEach(function (group) { - result.push({ - name: group.name, - days: days(group), - time: mondayTime(group) - }); - }); - return result; -} \ No newline at end of file +export const populate = (dict, map) => + id => tryReplace(dict, id, map); \ No newline at end of file diff --git a/src/routes/schedule.js b/src/routes/schedule.js index 5ba6ecdc..105ee567 100644 --- a/src/routes/schedule.js +++ b/src/routes/schedule.js @@ -1,62 +1,37 @@ -/** - * Created by tmshv on 22/11/14. - */ +import route from 'koa-route'; +import {json} from './'; -var route = require("koa-route"); -var router = require("./"); -var db = require("../core/db"); -var schedule = require("../models/schedule"); -var populate = require("../utils/populate").populate; -//import {getCourseNameByID} from "../models/course"; -//const team = require("../models/team"); +import {getSchedule, getScheduleList, populateSchedule} from '../core/schedule'; module.exports = function (app) { app.use( - route.get("/schedule/:period?/:semester?", router.accepts( - { - "text/html": router.index(), - "text/plain": router.index(), - - "application/json": function *(period, semester) { - this.type = "application/json"; - - var doPopulate = this.query.populate || false; - - var data = yield db.c("schedules").findOne({ - period: period, - semester: semester - }); - - if(!data) { - this.status = 404; - return; - } - - if(doPopulate) { - //data.schedule = schedule.populate(data.schedule, [ - // populate(team.short, "teacher"), - // populate(getCourseNameByID, "lesson") - //]); - } - - this.body = data; - } + route.get('/schedule/list', json( + function *() { + this.type = 'application/json'; + let data = yield getScheduleList(); + if (!data) this.status = 404; + else this.body = data; } )) ); app.use( - route.get("/schedules", router.accepts( - { - "text/html": router.index(), - "text/plain": router.index(), + route.get('/schedule/:period?/:semester?', json( + function *(period, semester) { + this.type = 'application/json'; - "application/json": function *() { - this.type = "application/json"; - var data = yield db.c("schedules").find({}, {period:1 , semester: 1}).toArray(); - if(!data) this.status = 404; - else this.body = data; + let data = yield getSchedule(period, semester); + if (!data) { + this.status = 404; + return; } + + let doPopulate = this.query.populate || false; + if (doPopulate) { + data.schedule = yield populateSchedule(data.schedule); + } + + this.body = data; } )) ); diff --git a/src/utils/populate.js b/src/utils/populate.js index 2582db30..d5a50261 100644 --- a/src/utils/populate.js +++ b/src/utils/populate.js @@ -25,11 +25,11 @@ export function pop(data){ return fun; } -export function populate(find, field){ - return function(lesson){ - var id = lesson[field]; - var val = find(id); - if(val) lesson[field] = val; - return lesson; +export function populate(fn, key){ + return (dict) => { + let id = dict[key]; + let value = fn(id); + dict[key] = value ? value : id; + return dict; } } \ No newline at end of file