Implement metafolders

master
Vitaliy Filippov 2016-10-09 02:01:04 +03:00
parent 2f5e95aab6
commit 9dd0c44dc1
1 changed files with 37 additions and 10 deletions

View File

@ -99,13 +99,35 @@ function ymd(dt)
return dt.getFullYear()+'-'+(m < 10 ? '0'+m : m)+'-'+(d < 10 ? '0'+d : d); return dt.getFullYear()+'-'+(m < 10 ? '0'+m : m)+'-'+(d < 10 ? '0'+d : d);
} }
SyncerWeb.prototype.msgSearchCond = function(query)
{
var p;
if (query.folderId)
p = this.pg.sql.eq('m.folder_id', query.folderId);
else if (query.folderType == 'unread')
p = this.pg.sql('(flags @> array[\'unread\']::varchar(255)[])');
else if (query.folderType == 'pinned')
p = this.pg.sql('(flags @> array[\'flagged\']::varchar(255)[])');
else if (query.folderType == 'inbox')
p = this.pg.sql('not (flags @> array[\'sent\']::varchar(255)[])');
else if (query.folderType == 'sent')
p = this.pg.sql('(flags @> array[\'sent\']::varchar(255)[])');
else if (query.folderType == 'outbox')
p = null;
else if (query.folderType == 'drafts' || query.folderType == 'spam' || query.folderType == 'trash')
p = null;
if (p && query.accountId)
p = this.pg.sql.and(p, this.pg.sql.eq('f.account_id', query.accountId));
return p;
}
SyncerWeb.prototype.get_groups = function*(req, res) SyncerWeb.prototype.get_groups = function*(req, res)
{ {
if (this.cfg.login && (!req.session || !req.session.auth)) if (this.cfg.login && (!req.session || !req.session.auth))
return res.sendStatus(401); return res.sendStatus(401);
var folderId = req.query.folderId; var cond = this.msgSearchCond(req.query);
if (!folderId) if (!cond)
return res.status(500).send('Need `folderId` query parameter'); return res.status(500).send('Need message query parameters');
var intervals = []; var intervals = [];
var today, today_ts; var today, today_ts;
today = new Date(ymd(new Date())); today = new Date(ymd(new Date()));
@ -133,13 +155,16 @@ SyncerWeb.prototype.get_groups = function*(req, res)
var [ groups ] = yield this.pg var [ groups ] = yield this.pg
.select('d.name, d.date, count(*) count') .select('d.name, d.date, count(*) count')
.from('messages m') .from('messages m')
.innerJoin('folders f', this.pg.sql('f.id=m.folder_id'))
.innerJoin(this.pg.sql.values(intervals).as('d').columns(), .innerJoin(this.pg.sql.values(intervals).as('d').columns(),
this.pg.sql('m.time >= d.date::date and m.time < d.date_end::date')) this.pg.sql('m.time >= d.date::date and m.time < d.date_end::date'))
.where({ folder_id: folderId }) .where(cond)
.groupBy('1, 2') .groupBy('1, 2')
.union( .union(
this.pg.select('date_part(\'year\', m.time)::text as name, date_part(\'year\', m.time)::text||\'-01-01\' date, count(*) count') 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 }) .from('messages m')
.innerJoin('folders f', this.pg.sql('f.id=m.folder_id'))
.where(cond)
.where(this.pg.sql.lt('m.time', intervals[0].date)) .where(this.pg.sql.lt('m.time', intervals[0].date))
.groupBy('1, 2') .groupBy('1, 2')
) )
@ -151,15 +176,17 @@ SyncerWeb.prototype.get_messages = function*(req, res)
{ {
if (this.cfg.login && (!req.session || !req.session.auth)) if (this.cfg.login && (!req.session || !req.session.auth))
return res.sendStatus(401); return res.sendStatus(401);
var folderId = req.query.folderId; var cond = this.msgSearchCond(req.query);
if (!folderId) if (!cond)
return res.status(500).send('Need `folderId` query parameter'); return res.status(500).send('Need message query parameters');
var limit = req.query.limit || 50; var limit = req.query.limit || 50;
if (limit > MAX_FETCH) if (limit > MAX_FETCH)
limit = MAX_FETCH; limit = MAX_FETCH;
var offset = req.query.offset || 0; var offset = req.query.offset || 0;
var [ msgs ] = yield this.pg.select('*').from('messages').where({ folder_id: folderId }) var [ msgs ] = yield this.pg.select('m.*').from('messages m')
.orderBy('time desc').limit(limit).offset(offset).rows(gen.ef()); .innerJoin('folders f', this.pg.sql('f.id=m.folder_id'))
.where(cond).orderBy('time desc').limit(limit).offset(offset)
.rows(gen.ef());
for (var i = 0; i < msgs.length; i++) for (var i = 0; i < msgs.length; i++)
{ {
delete msgs[i].text_index; delete msgs[i].text_index;