core update, schedule router update, schedule populator update, collective update, other

This commit is contained in:
tmshv committed 2016-02-25 03:29:03 +03:00
1 parent 7d97953877
commit f3aaf5a547
8 files changed
+113 -178

No files matched your search

+9
View File
@@ -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;
}
+4
View File
@@ -16,6 +16,10 @@ module.exports = {
});
},
close: function () {
client.close();
},
get db() {
return client;
},
+52
View File
@@ -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)
};
})
};
});
}
+6 -33
View File
@@ -1,36 +1,9 @@
//getPersonByID
export function person(collective, id){
for(var i=0; i<collective.length; i++){
var p = collective[i];
if(p.id == id){
return p;
}
}
return null;
export function shortifyName(name) {
let $ = 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);
}
+9 -30
View File
@@ -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; i<courses.length; i++){
+4 -61
View File
@@ -1,62 +1,5 @@
var pop = require("../utils/populate").pop;
let tryReplace = (dict, record, map = i=>i) =>
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;
}
export const populate = (dict, map) =>
id => tryReplace(dict, id, map);
+23 -48
View File
@@ -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;
}
))
);
+6 -6
View File
@@ -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;
}
}