From 9dd0c44dc14783047c1e5234875f8c7164213255 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sun, 9 Oct 2016 02:01:04 +0300 Subject: [PATCH] Implement metafolders --- SyncerWeb.js | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/SyncerWeb.js b/SyncerWeb.js index fc22848..51fab36 100644 --- a/SyncerWeb.js +++ b/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;