fix(drafts): Fix syncback issue caused by bad Account database query

This commit is contained in:
Ben Gotow 2015-09-29 12:14:11 -07:00
parent ddb19420fa
commit d821eded89
3 changed files with 22 additions and 15 deletions

View file

@ -7,6 +7,7 @@ Message = require '../../src/flux/models/message'
Account = require '../../src/flux/models/account'
Contact = require '../../src/flux/models/contact'
{APIError} = require '../../src/flux/errors'
AccountStore = require '../../src/flux/stores/account-store'
DatabaseStore = require '../../src/flux/stores/database-store'
TaskQueue = require '../../src/flux/stores/task-queue'
@ -30,10 +31,10 @@ remoteDraft = -> new Message _.extend {}, testData, {clientId: "local-id", serve
describe "SyncbackDraftTask", ->
beforeEach ->
spyOn(DatabaseStore, "run").andCallFake (query) ->
if query._klass is Account
return Promise.resolve(new Account(clientId: 'local-abc123', serverId: 'abc123'))
spyOn(AccountStore, "itemWithEmailAddress").andCallFake (email) ->
return new Account(clientId: 'local-abc123', serverId: 'abc123')
spyOn(DatabaseStore, "run").andCallFake (query) ->
clientId = query.matcherValueForModelKey('clientId')
if clientId is "localDraftId" then Promise.resolve(localDraft())
else if clientId is "remoteDraftId" then Promise.resolve(remoteDraft())

View file

@ -1,5 +1,6 @@
Actions = require '../actions'
Account = require '../models/account'
Utils = require '../models/utils'
DatabaseStore = require './database-store'
_ = require 'underscore'
@ -87,6 +88,11 @@ class AccountStore
items: =>
@_accounts
# Public: Returns the {Account} for the given email address, or null.
itemWithEmailAddress: (email) =>
_.find @_accounts, (account) ->
Utils.emailIsEquivalent(email, account.emailAddress)
# Public: Returns the currently active {Account}.
current: =>
@_accounts[@_index] || null

View file

@ -1,6 +1,7 @@
_ = require 'underscore'
Actions = require '../actions'
AccountStore = require '../stores/account-store'
DatabaseStore = require '../stores/database-store'
TaskQueueStatusStore = require '../stores/task-queue-status-store'
NylasAPI = require '../nylas-api'
@ -102,18 +103,17 @@ class SyncbackDraftTask extends Task
DatabaseStore.findBy(Message, clientId: @draftClientId).include(Message.attributes.body)
checkDraftFromMatchesAccount: (draft) ->
DatabaseStore.findBy(Account, [Account.attributes.emailAddress.equal(draft.from[0].email)]).then (account) =>
promise = Promise.resolve(draft)
if draft.accountId isnt account.id
account = AccountStore.itemWithEmailAddress(draft.from[0].email)
if draft.accountId is account.id
return Promise.resolve(draft)
else
DestroyDraftTask = require './destroy-draft'
destroy = new DestroyDraftTask(draftId: existingAccountDraft.id)
promise = TaskQueueStatusStore.waitForPerformLocal(destroy).then =>
@detatchFromRemoteID(existingAccountDraft, acct.id).then (newAccountDraft) =>
Promise.resolve(newAccountDraft)
Actions.queueTask(destroy)
promise
return promise
detatchFromRemoteID: (draft, newAccountId = null) ->
return Promise.resolve() unless draft