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);
}
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)
{
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 cond = this.msgSearchCond(req.query);
if (!cond)
return res.status(500).send('Need message query parameters');
var intervals = [];
var today, today_ts;
today = new Date(ymd(new Date()));
@ -133,13 +155,16 @@ SyncerWeb.prototype.get_groups = function*(req, res)
var [ groups ] = yield this.pg
.select('d.name, d.date, count(*) count')
.from('messages m')
.innerJoin('folders f', this.pg.sql('f.id=m.folder_id'))
.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 })
.where(cond)
.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 })
.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))
.groupBy('1, 2')
)
@ -151,15 +176,17 @@ SyncerWeb.prototype.get_messages = 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 cond = this.msgSearchCond(req.query);
if (!cond)
return res.status(500).send('Need message query parameters');
var limit = req.query.limit || 50;
if (limit > MAX_FETCH)
limit = MAX_FETCH;
var offset = req.query.offset || 0;
var [ msgs ] = yield this.pg.select('*').from('messages').where({ folder_id: folderId })
.orderBy('time desc').limit(limit).offset(offset).rows(gen.ef());
var [ msgs ] = yield this.pg.select('m.*').from('messages m')
.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++)
{
delete msgs[i].text_index;