diff --git a/api.py b/api.py index 159737a..9fd99e4 100644 --- a/api.py +++ b/api.py @@ -50,8 +50,9 @@ def CreateChannel(google_user, client, args): def SendMessage(google_user, client, args): subject = args['subject'] message = args['message'] + key = args.get('key', None) - models.Subject.FindOrCreate(subject).SendMessage(message, client.parent_key()) + models.Subject.FindOrCreate(subject).SendMessage(message, client.parent_key(), key) return {} @@ -90,10 +91,16 @@ def SetValue(google_user, client, args): def Subscribe(google_user, client, args): subject = models.Subject.FindOrCreate(args['subject']) messages = args.get('messages', 0) + keys = args.get('keys', []) - return { + ret = { 'events': models.Subscription.FindOrCreate(subject, client, messages), } + for key in keys: + message = models.Subject.GetKey(key) + if message: + ret['events'].append(message) + return ret def Unsubscribe(google_user, client, args): diff --git a/lib/models.py b/lib/models.py index 6ad532a..4d5a30d 100644 --- a/lib/models.py +++ b/lib/models.py @@ -27,6 +27,7 @@ import utils # ↳ StateEntry # # Subject +# ↳ Message # ↳ Subscription (⤴︎ Client) @@ -132,7 +133,7 @@ class Subject(db.Model): return cls(key_name=name).put() @db.transactional() - def RecentMessages(self, num_messages): + def GetRecentMessages(self, num_messages): query = ( Message.all() .ancestor(self) @@ -142,8 +143,20 @@ class Subject(db.Model): return reversed(query.fetch(limit=num_messages)) @db.transactional() - def SendMessage(self, message, sender): - obj = Message(parent=self, message=message, sender=sender) + def GetKey(self, key): + messages = ( + Message.all() + .ancestor(self) + .filter('key_ =', key) + .order('-created') + .fetch(1)) + if messages: + return messages[0] + return None + + @db.transactional() + def SendMessage(self, message, sender, key=None): + obj = Message(parent=self, message=message, sender=sender, key_=key) obj.put() event = obj.ToEvent() @@ -169,7 +182,7 @@ class Subscription(db.Model): cls(parent=subject, client=client).put() if messages == 0: return [] - return [m.ToEvent() for m in subject.RecentMessages(messages)] + return [m.ToEvent() for m in subject.GetRecentMessages(messages)] @classmethod @db.transactional() @@ -188,9 +201,11 @@ class Message(db.Model): created = db.DateTimeProperty(required=True, auto_now_add=True) message = db.TextProperty(required=True) sender = db.ReferenceProperty(required=True, reference_class=Profile) + # key and key_name are reserved + key_ = db.StringProperty() def ToEvent(self): - return { + ret = { 'event_type': 'message', 'id': self.key().id(), 'sender': str(Message.sender.get_value_for_datastore(self)), @@ -198,3 +213,6 @@ class Message(db.Model): 'created': self.created, 'message': self.message, } + if self.key_: + ret['key'] = self.key_ + return ret diff --git a/static/cosmopolite.js b/static/cosmopolite.js index adf5e0f..5b8326e 100644 --- a/static/cosmopolite.js +++ b/static/cosmopolite.js @@ -88,11 +88,15 @@ cosmopolite.Client.prototype.unsubscribe = function(subject) { }); }; -cosmopolite.Client.prototype.sendMessage = function(subject, message) { - this.sendRPC_('sendMessage', { +cosmopolite.Client.prototype.sendMessage = function(subject, message, key) { + args = { 'subject': subject, 'message': message, - }); + }; + if (key) { + args['key'] = key; + } + this.sendRPC_('sendMessage', args); }; cosmopolite.Client.prototype.getMessages = function(subject) { diff --git a/static/debug.html b/static/debug.html index 3c2e5c5..0454db4 100644 --- a/static/debug.html +++ b/static/debug.html @@ -11,39 +11,49 @@ a {
Google user:
-
- Key: - - - -
-
- Last set: - -
-
- Public -
-
- -
+ Key: + + +
-
-
- Subject: - - -
-
- - -
-
- - -
-
+ Last set: + +
+
+ Public +
+
+ +
+ +
+ +
+ Subject: + +
+
+ + +
+ +
+ +
+ Message: +
+
+ Key: +
+
+ +
+ +
+ +
+