|
|
@@ -0,0 +1,47 @@
|
|
|
+import pika
|
|
|
+import json
|
|
|
+
|
|
|
+from radicale import hook
|
|
|
+from enum import Enum
|
|
|
+
|
|
|
+
|
|
|
+class Hook(hook.BaseHook):
|
|
|
+
|
|
|
+ def __init__(self, configuration):
|
|
|
+ super().__init__(configuration)
|
|
|
+ endpoint = configuration.get("hook", "rabbitmq_endpoint")
|
|
|
+ self.topic = configuration.get("hook", "rabbitmq_topic")
|
|
|
+ self.encoding = configuration.get("encoding", "stock")
|
|
|
+
|
|
|
+ self._make_connection_synced(endpoint)
|
|
|
+ self._make_declare_queue_synced(self.topic)
|
|
|
+
|
|
|
+ def _make_connection_synced(self, endpoint):
|
|
|
+ parameters = pika.URLParameters(endpoint)
|
|
|
+ self.connection = pika.BlockingConnection(parameters)
|
|
|
+ self.channel = self.connection.channel()
|
|
|
+
|
|
|
+ def _make_declare_queue_synced(self, topic):
|
|
|
+ self.channel.queue_declare(queue=topic)
|
|
|
+
|
|
|
+ def notify(self, content):
|
|
|
+ if not isinstance(content, QueueItem):
|
|
|
+ return
|
|
|
+ self.channel.basic_publish(exchange='',
|
|
|
+ routing_key=self.topic,
|
|
|
+ body=content.to_json().encode(encoding=self.encoding))
|
|
|
+
|
|
|
+
|
|
|
+class QueueItemTypes(Enum):
|
|
|
+ UPSERT = "upsert"
|
|
|
+ DELETE = "delete"
|
|
|
+
|
|
|
+
|
|
|
+class QueueItem:
|
|
|
+
|
|
|
+ def __init__(self, queue_item_type, content):
|
|
|
+ self.type = queue_item_type.value
|
|
|
+ self.content = content
|
|
|
+
|
|
|
+ def to_json(self):
|
|
|
+ return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)
|