From 345223914b852603a2feda84c09baf5e10fec9a1 Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Wed, 18 Mar 2020 20:21:23 +0100
Subject: [PATCH] Hook: Proper handling of occurrences

---
 hook.wsgi | 136 +++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 99 insertions(+), 37 deletions(-)

diff --git a/hook.wsgi b/hook.wsgi
index 5306dfe..320af2d 100644
--- a/hook.wsgi
+++ b/hook.wsgi
@@ -66,61 +66,123 @@ class HookApp:
             ])
         return ["{} {}".format(code, msg)]
 
-    def create_meeting(self, js):
-        payload = js["payload"]
-        object = payload["object"]
-        meeting_id = object["id"]
-
-        type = object["type"]
-        if type != 2 and type != 8:
-            self.log(f"Meeting type {type} ignored")
-            return
-
-        host_user_id = object["host_id"]
-        db_query("SELECT * FROM zoom_users WHERE user_id=%s", (host_user_id,))
-        user = db.fetchone()
-        if user is None:
-            self.log(f"Meeting {meeting_id}: Host {host_user_id} not found in zoom_users")
-
+    def create_regular_meeting(self, uid, meeting):
+        meeting_id = meeting["id"]
         self.log(f"Meeting {meeting_id}: Planning")
+
         db_query("""
                 INSERT INTO zoom_meetings
                 (meeting_id, uuid, host_id, topic, type, start_time, duration)
                 VALUES (%s, %s, %s, %s, %s, %s, %s)
             """, (
                 meeting_id,
-                object['uuid'],
-                user.id,
-                object['topic'],
-                object['type'],
-                parse_time(object['start_time'], object['timezone']),
-                object['duration'],
+                meeting['uuid'],
+                uid,
+                meeting['topic'],
+                meeting['type'],
+                parse_time(meeting['start_time'], meeting['timezone']),
+                meeting['duration'],
             ))
 
         db_connection.commit()
 
-    def delete_meeting(self, js):
+
+    def create_recurring_meeting(self, uid, meeting):
+        meeting_id = meeting["id"]
+
+        for occ in meeting["occurrences"]:
+            occ_id = occ["occurrence_id"]
+            self.log(f"Meeting {meeting_id}: Planning occurrence {occ_id}")
+
+            db_query("""
+                    INSERT INTO zoom_meetings
+                    (meeting_id, uuid, occurrence_id, host_id, topic, type, start_time, duration)
+                    VALUES (%s, %s, %s, %s, %s, %s, %s, %s)
+                """, (
+                    meeting_id,
+                    meeting['uuid'],
+                    occ_id,
+                    uid,
+                    meeting['topic'],
+                    meeting['type'],
+                    parse_time(occ['start_time'], meeting['timezone']),
+                    occ['duration'],
+                ))
+
+        db_connection.commit()
+
+
+    def create_meeting(self, js):
         payload = js["payload"]
-        object = payload["object"]
-        meeting_id = object["id"]
+        meeting = payload["object"]
+        meeting_id = meeting["id"]
+
+        host_user_id = meeting["host_id"]
+        db_query("SELECT * FROM zoom_users WHERE user_id=%s", (host_user_id,))
+        user = db.fetchone()
+        if user is None:
+            self.log(f"Meeting {meeting_id}: Host {host_user_id} not found in zoom_users")
+            return
 
-        type = object["type"]
-        if type != 2 and type != 8:
-            self.log(f"Meeting type {type} ignored")
+        type = meeting["type"]
+        if type == 2:
+            self.create_regular_meeting(user.id, meeting)
+        elif type == 8:
+            self.create_recurring_meeting(user.id, meeting)
+        else:
+            self.log(f"Meeting {meeting_id}: Unknown type {type}")
             return
 
+
+    def delete_regular_meeting(self, meeting):
+        meeting_id = meeting["id"]
+
         self.log(f"Meeting {meeting_id}: Deleting")
         db_query("""
                 DELETE FROM zoom_meetings
-                WHERE meeting_id=%s AND start_time=%s AND duration=%s
+                WHERE meeting_id=%s
             """, (
                 meeting_id,
-                parse_time(object['start_time'], object['timezone']),
-                object['duration'],
             ))
 
         db_connection.commit()
 
+
+    def delete_recurring_meeting(self, meeting):
+        meeting_id = meeting["id"]
+
+        if "occurrences" not in meeting:
+            return self.delete_regular_meeting(meeting)
+
+        for occ in meeting["occurrences"]:
+            occ_id = occ["occurrence_id"]
+            self.log(f"Meeting {meeting_id}: Deleting occurrence {occ_id}")
+            db_query("""
+                    DELETE FROM zoom_meetings
+                    WHERE meeting_id=%s AND occurrence_id=%s
+                """, (
+                    meeting_id,
+                    occ_id,
+                ))
+
+        db_connection.commit()
+
+
+    def delete_meeting(self, js):
+        payload = js["payload"]
+        meeting = payload["object"]
+        meeting_id = meeting["id"]
+
+        type = meeting["type"]
+        if type == 2:
+            self.delete_regular_meeting(meeting)
+        elif type == 8:
+            self.delete_recurring_meeting(meeting)
+        else:
+            self.log(f"Meeting {meeting_id}: Unknown type {type}")
+            return
+
+
     def run(self):
         method = self.env['REQUEST_METHOD']
         if method != 'POST':
@@ -135,12 +197,12 @@ class HookApp:
         self.log(js)
 
         event = js["event"]
-#        if event == "meeting.created":
-#            self.create_meeting(js)
-#        elif event == "meeting.deleted":
-#            self.delete_meeting(js)
-#        else:
-#            self.log(f"Unknown event: {event}")
+        if event == "meeting.created":
+            self.create_meeting(js)
+        elif event == "meeting.deleted":
+            self.delete_meeting(js)
+        else:
+            self.log(f"Unknown event: {event}")
 
         self.wsgi_start("204 No Content", [])
         return b""
-- 
GitLab