Implement server-side message grouping info

master
Vitaliy Filippov 2016-10-07 02:06:31 +03:00
parent 5942a379f9
commit 1eb647409a
1 changed files with 56 additions and 0 deletions

View File

@ -30,6 +30,7 @@ function SyncerWeb(syncer, pg, cfg)
this.app.get('/auth', this.get_auth);
this.app.post('/auth', this.post_auth);
this.app.get('/folders', genRequest(this.get_folders.bind(this)));
this.app.get('/groups', genRequest(this.get_groups.bind(this)));
this.app.get('/messages', genRequest(this.get_messages.bind(this)));
this.app.get('/message', genRequest(this.get_message.bind(this)));
this.app.post('/sync', genRequest(this.post_sync.bind(this)));
@ -89,6 +90,61 @@ SyncerWeb.prototype.get_folders = function*(req, res)
return res.send({ accounts: accounts });
}
function ymd(dt)
{
var m = dt.getMonth()+1;
var d = dt.getDate();
return dt.getFullYear()+'-'+(m < 10 ? '0'+m : m)+'-'+(d < 10 ? '0'+d : d);
}
SyncerWeb.prototype.get_groups = function*(req, res)
{
if (this.cfg.login && (!req.session || !req.session.auth))
return res.sendStatus(401);
var folderId = req.query.folderId;
if (!folderId)
return res.status(500).send('Need `folderId` query parameter');
var intervals = [];
var today, today_ts;
today = new Date(ymd(new Date()));
today_ts = today.getTime();
var week_start = today_ts - ((today.getDay()+6)%7)*86400000;
var prev_week = ymd(new Date(week_start - 86400000*7));
for (var i = 1; i <= 12; i++)
{
var d = today.getFullYear()+'-'+(i < 10 ? '0' : '')+i+'-01';
if (d >= prev_week)
break;
intervals.push({ date: d, name: 'm'+i });
}
intervals.push({ date: prev_week, name: 'pw' });
for (var i = week_start, d = 1; i < today_ts; i += 86400000, d++)
{
intervals.push({ date: ymd(new Date(i)), name: 'd'+d });
}
intervals.push({ date: ymd(today), name: 't' });
for (var i = 0; i < intervals.length-1; i++)
{
intervals[i].date_end = intervals[i+1].date;
}
intervals[i].date_end = '100000-12-31'; // it's faster than (is null or <)
var [ groups ] = yield this.pg
.select('d.name, d.date, count(*) count')
.from('messages m')
.innerJoin(this.pg.sql.values(intervals).as('d').columns(),
this.pg.sql('m.time >= d.date::date and m.time < d.date_end::date'))
.where({ folder_id: folderId })
.groupBy('1, 2')
.union(
this.pg.select('date_part(\'year\', m.time)::text as name, date_part(\'year\', m.time)::text||\'-01-01\' date, count(*) count')
.from('messages m').where({ folder_id: folderId })
.where(this.pg.sql.lt('m.time', intervals[0].date))
.groupBy('1, 2')
)
.orderBy('date desc').rows(gen.ef());
return res.send({ groups: groups });
}
SyncerWeb.prototype.get_messages = function*(req, res)
{
if (this.cfg.login && (!req.session || !req.session.auth))