When rebuilding the channel, subscribe via last seen ID, so we don't miss messages from the time we were disconnected.
This commit is contained in:
3
api.py
3
api.py
@@ -71,10 +71,11 @@ def SendMessage(google_user, client, args):
|
||||
def Subscribe(google_user, client, args):
|
||||
subject = models.Subject.FindOrCreate(args['subject'])
|
||||
messages = args.get('messages', 0)
|
||||
last_id = args.get('last_id', None)
|
||||
keys = args.get('keys', [])
|
||||
|
||||
ret = {
|
||||
'events': models.Subscription.FindOrCreate(subject, client, messages),
|
||||
'events': models.Subscription.FindOrCreate(subject, client, messages, last_id),
|
||||
}
|
||||
for key in keys:
|
||||
message = subject.GetKey(key)
|
||||
|
||||
@@ -117,6 +117,15 @@ class Subject(db.Model):
|
||||
num_messages = None
|
||||
return reversed(query.fetch(limit=num_messages))
|
||||
|
||||
@db.transactional()
|
||||
def GetMessagesSince(self, last_id):
|
||||
query = (
|
||||
Message.all()
|
||||
.ancestor(self)
|
||||
.filter('id_ >', last_id)
|
||||
.order('id_'))
|
||||
return list(query)
|
||||
|
||||
@db.transactional()
|
||||
def GetKey(self, key):
|
||||
messages = (
|
||||
@@ -179,7 +188,7 @@ class Subscription(db.Model):
|
||||
|
||||
@classmethod
|
||||
@db.transactional()
|
||||
def FindOrCreate(cls, subject, client, messages):
|
||||
def FindOrCreate(cls, subject, client, messages=0, last_id=None):
|
||||
subscriptions = (
|
||||
cls.all(keys_only=True)
|
||||
.ancestor(subject)
|
||||
@@ -187,9 +196,12 @@ class Subscription(db.Model):
|
||||
.fetch(1))
|
||||
if not subscriptions:
|
||||
cls(parent=subject, client=client).put()
|
||||
if messages == 0:
|
||||
return []
|
||||
return [m.ToEvent() for m in subject.GetRecentMessages(messages)]
|
||||
events = []
|
||||
if messages:
|
||||
events.extend(m.ToEvent() for m in subject.GetRecentMessages(messages))
|
||||
if last_id:
|
||||
events.extend(m.ToEvent() for m in subject.GetMessagesSince(last_id))
|
||||
return events
|
||||
|
||||
@classmethod
|
||||
@db.transactional()
|
||||
|
||||
@@ -423,13 +423,17 @@ Cosmopolite.prototype.createChannel_ = function() {
|
||||
'onSuccess': this.onCreateChannel_,
|
||||
},
|
||||
];
|
||||
// TODO(flamingcow): Need to restart from the latest message.
|
||||
for (var subject in this.subscriptions_) {
|
||||
var subscription = this.subscriptions_[subject];
|
||||
var last_id = 0;
|
||||
if (subscription.messages.length > 0) {
|
||||
last_id = subscription.messages[subscription.messages.length - 1]['id'];
|
||||
}
|
||||
rpcs.push({
|
||||
'command': 'subscribe',
|
||||
'arguments': {
|
||||
'subject': subject,
|
||||
'messages': 0,
|
||||
'last_id': last_id,
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user