From 9ed7a696b474b34f462804b66f12bdaeecdf2e62 Mon Sep 17 00:00:00 2001 From: Tankred Hase Date: Thu, 10 Oct 2013 19:15:16 +0200 Subject: [PATCH] list well known folders works in dao... not yet in ui --- src/js/app-config.js | 23 +------------ src/js/controller/mail-list.js | 4 +++ src/js/controller/navigation.js | 34 ++++++++++++++++--- src/js/dao/email-dao.js | 52 ++++++++++++++++++++++++++++-- test/integration/email-dao-test.js | 15 +++++++++ test/new-unit/email-dao-test.js | 35 +++++++++++++++++--- 6 files changed, 131 insertions(+), 32 deletions(-) diff --git a/src/js/app-config.js b/src/js/app-config.js index 97e2620..d883675 100644 --- a/src/js/app-config.js +++ b/src/js/app-config.js @@ -26,28 +26,7 @@ define([], function() { secure: true, port: 465, host: 'smtp.gmail.com' - }, - folders: [{ - type: 'Inbox', - count: undefined, - path: 'INBOX' - }, { - type: 'Sent', - count: undefined, - path: '[Gmail]/Gesendet' - }, { - type: 'Outbox', - count: undefined, - path: 'OUTBOX' - }, { - type: 'Drafts', - count: undefined, - path: '[Gmail]/Entw&APw-rfe' - }, { - type: 'Trash', - count: undefined, - path: '[Gmail]/Papierkorb' - }] + } } }; diff --git a/src/js/controller/mail-list.js b/src/js/controller/mail-list.js index 6aa08dc..08a6df4 100644 --- a/src/js/controller/mail-list.js +++ b/src/js/controller/mail-list.js @@ -52,6 +52,10 @@ define(function(require) { }; $scope.$watch('currentFolder', function() { + if (!getFolder()) { + return; + } + // production... in chrome packaged app if (window.chrome && chrome.identity) { initList(); diff --git a/src/js/controller/navigation.js b/src/js/controller/navigation.js index a5a4882..a936aa5 100644 --- a/src/js/controller/navigation.js +++ b/src/js/controller/navigation.js @@ -1,11 +1,24 @@ define(function(require) { 'use strict'; - var folders = require('js/app-config').config.gmail.folders; + var appController = require('js/app-controller'), + emailDao; var NavigationCtrl = function($scope) { $scope.navOpen = false; - $scope.folders = folders; + + emailDao = appController._emailDao; + + initFolders(function(folders) { + $scope.folders = folders; + $scope.apply(); + // select inbox as the current folder on init + $scope.openFolder($scope.folders[0]); + }); + + // + // scope functions + // $scope.openNav = function() { $scope.navOpen = true; @@ -19,8 +32,6 @@ define(function(require) { $scope.currentFolder = folder; $scope.closeNav(); }; - // select inbox as the current folder on init - $scope.openFolder($scope.folders[0]); $scope.write = function(replyTo) { var replyToId = (replyTo) ? replyTo.uid : '', @@ -38,6 +49,21 @@ define(function(require) { window.open(url, 'Compose Message', 'toolbar=no,width=720,height=640,left=500,top=200,status=no,scrollbars=no,resize=no'); }; + + // + // helper functions + // + + function initFolders(callback) { + emailDao.imapListFolders(function(err, folders) { + if (err) { + console.log(err); + return; + } + + callback(folders); + }); + } }; return NavigationCtrl; diff --git a/src/js/dao/email-dao.js b/src/js/dao/email-dao.js index 41cc152..cc70235 100644 --- a/src/js/dao/email-dao.js +++ b/src/js/dao/email-dao.js @@ -105,9 +105,57 @@ define(function(require) { * List the folders in the user's IMAP mailbox. */ EmailDAO.prototype.imapListFolders = function(callback) { - var self = this; + var self = this, + dbType = 'folders'; - self._imapClient.listAllFolders(callback); + // check local cache + self._devicestorage.listItems(dbType, 0, null, function(err, stored) { + if (err) { + callback(err); + return; + } + + if (!stored || stored.length < 1) { + // no folders cached... fetch from server + fetchFromServer(); + return; + } + + callback(null, stored[0]); + }); + + function fetchFromServer() { + var folders; + + // fetch list from imap server + self._imapClient.listWellKnownFolders(function(err, wellKnownFolders) { + if (err) { + callback(err); + return; + } + + folders = [ + wellKnownFolders.inbox, + wellKnownFolders.sent, { + type: 'Outbox', + path: 'OUTBOX' + }, + wellKnownFolders.drafts, + wellKnownFolders.trash + ]; + + // cache locally + // persist encrypted list in device storage + self._devicestorage.storeList([folders], dbType, function(err) { + if (err) { + callback(err); + return; + } + + callback(null, folders); + }); + }); + } }; /** diff --git a/test/integration/email-dao-test.js b/test/integration/email-dao-test.js index 06c3022..416b2eb 100644 --- a/test/integration/email-dao-test.js +++ b/test/integration/email-dao-test.js @@ -40,6 +40,21 @@ define(function(require) { }); }); + describe('List well known folders', function() { + it('should work', function(done) { + // clear folders from cache + emailDao._devicestorage.removeList('folders', function(err) { + expect(err).to.not.exist; + + emailDao.imapListFolders(function(err, folders) { + expect(err).to.not.exist; + expect(folders.length).to.be.at.least(1); + done(); + }); + }); + }); + }); + describe('IMAP sync INBOX messages', function() { it('should work', function(done) { emailDao.imapSync({ diff --git a/test/new-unit/email-dao-test.js b/test/new-unit/email-dao-test.js index 18cbd3c..2c46d32 100644 --- a/test/new-unit/email-dao-test.js +++ b/test/new-unit/email-dao-test.js @@ -218,11 +218,38 @@ define(function(require) { }); describe('IMAP: list folders', function() { - it('should work', function(done) { - imapClientStub.listAllFolders.yields(); - emailDao.imapListFolders(function(err) { - expect(imapClientStub.listAllFolders.calledOnce).to.be.true; + var dummyFolders = [{ + type: 'Inbox', + path: 'INBOX' + }, { + type: 'Outbox', + path: 'OUTBOX' + }]; + + it('should work on empty local db', function(done) { + devicestorageStub.listItems.yields(null, [dummyFolders]); + + emailDao.imapListFolders(function(err, folders) { expect(err).to.not.exist; + expect(devicestorageStub.listItems.calledOnce).to.be.true; + expect(folders[0].type).to.equal('Inbox'); + done(); + }); + }); + + it('should work with local cache', function(done) { + devicestorageStub.listItems.yields(null, []); + imapClientStub.listWellKnownFolders.yields(null, { + inbox: dummyFolders[0] + }); + devicestorageStub.storeList.yields(); + + emailDao.imapListFolders(function(err, folders) { + expect(err).to.not.exist; + expect(devicestorageStub.listItems.calledOnce).to.be.true; + expect(imapClientStub.listWellKnownFolders.calledOnce).to.be.true; + expect(devicestorageStub.storeList.calledOnce).to.be.true; + expect(folders[0].type).to.equal('Inbox'); done(); }); });