Implement metafolders
parent
2f5e95aab6
commit
9dd0c44dc1
47
SyncerWeb.js
47
SyncerWeb.js
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue