Skip to content

Commit

Permalink
Fetch conversation before saving in all sync handlers
Browse files Browse the repository at this point in the history
FREEBIE
  • Loading branch information
scottnonnenberg committed Aug 4, 2017
1 parent 9db0a58 commit 0adc398
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 68 deletions.
125 changes: 71 additions & 54 deletions js/background.js
Expand Up @@ -146,42 +146,50 @@
}

function onContactReceived(ev) {
var contactDetails = ev.contactDetails;
var details = ev.contactDetails;

var id = details.number;
var c = new Whisper.Conversation({
name: contactDetails.name,
id: contactDetails.number,
avatar: contactDetails.avatar,
color: contactDetails.color,
type: 'private',
active_at: Date.now()
id: id
});
var error;
if ((error = c.validateNumber())) {
console.log(error.stack);
return;
var error = c.validateNumber();
if (error) {
console.log('Invalid contact received', error && error.stack ? error.stack : error);
return;
}

ConversationController.create(c).save().then(ev.confirm);
ConversationController.findOrCreatePrivateById(id).then(function(conversation) {
return new Promise(function(resolve, reject) {
conversation.save({
name: details.name,
avatar: details.avatar,
color: details.color,
active_at: conversation.get('active_at') || Date.now(),
}).then(resolve, reject);
});
}).then(ev.confirm);
}

function onGroupReceived(ev) {
var groupDetails = ev.groupDetails;
var attributes = {
id: groupDetails.id,
name: groupDetails.name,
members: groupDetails.members,
avatar: groupDetails.avatar,
type: 'group',
};
if (groupDetails.active) {
attributes.active_at = Date.now();
} else {
attributes.left = true;
}

var conversation = ConversationController.create(attributes);
conversation.save().then(ev.confirm);
var details = ev.groupDetails;
var id = details.id;

return ConversationController.findOrCreateById(id).then(function(conversation) {
var updates = {
name: details.name,
members: details.members,
avatar: details.avatar,
type: 'group',
};
if (details.active) {
updates.active_at = Date.now();
} else {
updates.left = true;
}
return new Promise(function(resolve, reject) {
conversation.save(updates).then(resolve, reject);
}).then(ev.confirm);
});
}

function onMessageReceived(ev) {
Expand Down Expand Up @@ -344,39 +352,48 @@
var key = ev.verified.identityKey;
var state;

var c = new Whisper.Conversation({
id: number
});
var error = c.validateNumber();
if (error) {
console.log(
'Invalid verified sync received',
error && error.stack ? error.stack : error
);
return;
}

switch(ev.verified.state) {
case textsecure.protobuf.Verified.State.DEFAULT:
state = 'DEFAULT';
break;
case textsecure.protobuf.Verified.State.VERIFIED:
state = 'VERIFIED';
break;
case textsecure.protobuf.Verified.State.UNVERIFIED:
state = 'UNVERIFIED';
break;
case textsecure.protobuf.Verified.State.DEFAULT:
state = 'DEFAULT';
break;
case textsecure.protobuf.Verified.State.VERIFIED:
state = 'VERIFIED';
break;
case textsecure.protobuf.Verified.State.UNVERIFIED:
state = 'UNVERIFIED';
break;
}

console.log('got verified sync for', number, state,
ev.viaContactSync ? 'via contact sync' : '');

var contact = ConversationController.get(number);
if (!contact) {
return;
}

var options = {
viaSyncMessage: true,
viaContactSync: ev.viaContactSync,
key: key
};
return ConversationController.findOrCreatePrivateById(number).then(function(contact) {
var options = {
viaSyncMessage: true,
viaContactSync: ev.viaContactSync,
key: key
};

if (state === 'VERIFIED') {
contact.setVerified(options).then(ev.confirm);
} else if (state === 'DEFAULT') {
contact.setVerifiedDefault(options).then(ev.confirm);
} else {
contact.setUnverified(options).then(ev.confirm);
}
if (state === 'VERIFIED') {
return contact.setVerified(options).then(ev.confirm);
} else if (state === 'DEFAULT') {
return contact.setVerifiedDefault(options).then(ev.confirm);
} else {
return contact.setUnverified(options).then(ev.confirm);
}
});
}

function onDeliveryReceipt(ev) {
Expand Down
32 changes: 22 additions & 10 deletions js/conversation_controller.js
Expand Up @@ -87,19 +87,31 @@
return conversation;
},
findOrCreatePrivateById: function(id) {
var conversation = conversations.add({ id: id, type: 'private' });
var conversation = conversations.add({
id: id,
type: 'private'
});
return new Promise(function(resolve, reject) {
conversation.fetch().then(function() {
resolve(conversation);
}, function() {
conversation.save().then(function() {
resolve(conversation);
}, reject);
});
});
},
findOrCreateById: function(id) {
var conversation = conversations.add({
id: id
});
return new Promise(function(resolve, reject) {
conversation.fetch().then(function() {
resolve(conversation);
}).fail(function() {
var saved = conversation.save(); // false or indexedDBRequest
if (saved) {
saved.then(function() {
resolve(conversation);
}).fail(reject);
} else {
reject();
}
}, function() {
conversation.save().then(function() {
resolve(conversation);
}, reject);
});
});
},
Expand Down
10 changes: 6 additions & 4 deletions js/models/conversations.js
Expand Up @@ -84,24 +84,26 @@
},
safeFetch: function() {
// new Promise necessary because a fetch will fail if convo not in db yet
return new Promise(function(resolve) { this.fetch().always(resolve); }.bind(this));
return new Promise(function(resolve) {
this.fetch().always(resolve);
}.bind(this));
},
setVerifiedDefault: function(options) {
var DEFAULT = this.verifiedEnum.DEFAULT;
return this.queueJob(function() {
return this.safeFetch().then(this._setVerified.bind(this, DEFAULT, options));
return this._setVerified(DEFAULT, options);
}.bind(this));
},
setVerified: function(options) {
var VERIFIED = this.verifiedEnum.VERIFIED;
return this.queueJob(function() {
return this.safeFetch().then(this._setVerified.bind(this, VERIFIED, options));
return this._setVerified(VERIFIED, options);
}.bind(this));
},
setUnverified: function(options) {
var UNVERIFIED = this.verifiedEnum.UNVERIFIED;
return this.queueJob(function() {
return this.safeFetch().then(this._setVerified.bind(this, UNVERIFIED, options));
return this._setVerified(UNVERIFIED, options);
}.bind(this));
},
_setVerified: function(verified, options) {
Expand Down

0 comments on commit 0adc398

Please sign in to comment.