Fetch conversation before saving in all sync handlers

FREEBIE
This commit is contained in:
Scott Nonnenberg 2017-07-21 10:59:41 -07:00
parent 9db0a58260
commit 0adc398a6f
3 changed files with 98 additions and 67 deletions

View file

@ -146,42 +146,50 @@
} }
function onContactReceived(ev) { function onContactReceived(ev) {
var contactDetails = ev.contactDetails; var details = ev.contactDetails;
var id = details.number;
var c = new Whisper.Conversation({ var c = new Whisper.Conversation({
name: contactDetails.name, id: id
id: contactDetails.number,
avatar: contactDetails.avatar,
color: contactDetails.color,
type: 'private',
active_at: Date.now()
}); });
var error; var error = c.validateNumber();
if ((error = c.validateNumber())) { if (error) {
console.log(error.stack); console.log('Invalid contact received', error && error.stack ? error.stack : error);
return; 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) { function onGroupReceived(ev) {
var groupDetails = ev.groupDetails; var details = ev.groupDetails;
var attributes = { var id = details.id;
id: groupDetails.id,
name: groupDetails.name, return ConversationController.findOrCreateById(id).then(function(conversation) {
members: groupDetails.members, var updates = {
avatar: groupDetails.avatar, name: details.name,
members: details.members,
avatar: details.avatar,
type: 'group', type: 'group',
}; };
if (groupDetails.active) { if (details.active) {
attributes.active_at = Date.now(); updates.active_at = Date.now();
} else { } else {
attributes.left = true; updates.left = true;
} }
return new Promise(function(resolve, reject) {
var conversation = ConversationController.create(attributes); conversation.save(updates).then(resolve, reject);
conversation.save().then(ev.confirm); }).then(ev.confirm);
});
} }
function onMessageReceived(ev) { function onMessageReceived(ev) {
@ -344,6 +352,18 @@
var key = ev.verified.identityKey; var key = ev.verified.identityKey;
var state; 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) { switch(ev.verified.state) {
case textsecure.protobuf.Verified.State.DEFAULT: case textsecure.protobuf.Verified.State.DEFAULT:
state = 'DEFAULT'; state = 'DEFAULT';
@ -359,11 +379,7 @@
console.log('got verified sync for', number, state, console.log('got verified sync for', number, state,
ev.viaContactSync ? 'via contact sync' : ''); ev.viaContactSync ? 'via contact sync' : '');
var contact = ConversationController.get(number); return ConversationController.findOrCreatePrivateById(number).then(function(contact) {
if (!contact) {
return;
}
var options = { var options = {
viaSyncMessage: true, viaSyncMessage: true,
viaContactSync: ev.viaContactSync, viaContactSync: ev.viaContactSync,
@ -371,12 +387,13 @@
}; };
if (state === 'VERIFIED') { if (state === 'VERIFIED') {
contact.setVerified(options).then(ev.confirm); return contact.setVerified(options).then(ev.confirm);
} else if (state === 'DEFAULT') { } else if (state === 'DEFAULT') {
contact.setVerifiedDefault(options).then(ev.confirm); return contact.setVerifiedDefault(options).then(ev.confirm);
} else { } else {
contact.setUnverified(options).then(ev.confirm); return contact.setUnverified(options).then(ev.confirm);
} }
});
} }
function onDeliveryReceipt(ev) { function onDeliveryReceipt(ev) {

View file

@ -87,19 +87,31 @@
return conversation; return conversation;
}, },
findOrCreatePrivateById: function(id) { 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) { return new Promise(function(resolve, reject) {
conversation.fetch().then(function() { conversation.fetch().then(function() {
resolve(conversation); resolve(conversation);
}).fail(function() { }, function() {
var saved = conversation.save(); // false or indexedDBRequest conversation.save().then(function() {
if (saved) {
saved.then(function() {
resolve(conversation); resolve(conversation);
}).fail(reject); }, reject);
} else { });
reject(); });
} },
findOrCreateById: function(id) {
var conversation = conversations.add({
id: id
});
return new Promise(function(resolve, reject) {
conversation.fetch().then(function() {
resolve(conversation);
}, function() {
conversation.save().then(function() {
resolve(conversation);
}, reject);
}); });
}); });
}, },

View file

@ -84,24 +84,26 @@
}, },
safeFetch: function() { safeFetch: function() {
// new Promise necessary because a fetch will fail if convo not in db yet // 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) { setVerifiedDefault: function(options) {
var DEFAULT = this.verifiedEnum.DEFAULT; var DEFAULT = this.verifiedEnum.DEFAULT;
return this.queueJob(function() { return this.queueJob(function() {
return this.safeFetch().then(this._setVerified.bind(this, DEFAULT, options)); return this._setVerified(DEFAULT, options);
}.bind(this)); }.bind(this));
}, },
setVerified: function(options) { setVerified: function(options) {
var VERIFIED = this.verifiedEnum.VERIFIED; var VERIFIED = this.verifiedEnum.VERIFIED;
return this.queueJob(function() { return this.queueJob(function() {
return this.safeFetch().then(this._setVerified.bind(this, VERIFIED, options)); return this._setVerified(VERIFIED, options);
}.bind(this)); }.bind(this));
}, },
setUnverified: function(options) { setUnverified: function(options) {
var UNVERIFIED = this.verifiedEnum.UNVERIFIED; var UNVERIFIED = this.verifiedEnum.UNVERIFIED;
return this.queueJob(function() { return this.queueJob(function() {
return this.safeFetch().then(this._setVerified.bind(this, UNVERIFIED, options)); return this._setVerified(UNVERIFIED, options);
}.bind(this)); }.bind(this));
}, },
_setVerified: function(verified, options) { _setVerified: function(verified, options) {