Implement server-side message grouping info
parent
5942a379f9
commit
1eb647409a
56
SyncerWeb.js
56
SyncerWeb.js
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue