diff --git a/TODO b/TODO
index c56674aabfb30ae0d773a3b3130804d5942160da..93b7021665f1ab3fd2e65d18d6ec5aae3cc0e478 100644
--- a/TODO
+++ b/TODO
@@ -1,11 +1,12 @@
 DB:
 - Trigger na "last modified" u meetingů
 - indexy
-- vazby: on delete cascade
 
 Hook:
 - Adjust number of workers
 - Ztlumit logování
-- další hooky: create/delete user, start/end meeting, participants
+- další hooky: create/delete user
 - přehlednější log
-- logování raw JSONů
+
+App:
+- ukončovat transakce
diff --git a/hook/fetch-meetings.py b/hook/fetch-meetings.py
index 873000a8818d679b856491f1037bc3e29723a9a8..916434603204983c140c926b8d6b0644e4646410 100755
--- a/hook/fetch-meetings.py
+++ b/hook/fetch-meetings.py
@@ -133,7 +133,6 @@ def get_meetings(uid, user_id):
 
 
 def fetch_all():
-    db.execute('DELETE FROM zoom_schedule')
     db.execute('DELETE FROM zoom_meetings')
 
     db.execute("SELECT * FROM zoom_users")
@@ -144,6 +143,17 @@ def fetch_all():
     db_conn.commit()
 
 
+def fetch_user(user_email):
+    db.execute("SELECT * FROM zoom_users WHERE email=%s", (user_email,))
+    u = db.fetchone()
+    if not u:
+        die("No such user.")
+
+    db.execute('DELETE FROM zoom_meetings WHERE host_uid=%s', (u.uid,))
+    get_meetings(u.uid, u.user_id)
+    db_conn.commit()
+
+
 def fetch_single(user_email, meeting_id):
     db.execute("SELECT * FROM zoom_meetings WHERE meeting_id=%s", (meeting_id,))
     meeting_row = db.fetchone()
@@ -189,6 +199,6 @@ if args.all:
 elif args.meeting is not None:
     fetch_single(args.user, args.meeting)
 elif args.user is not None:
-    raise NotImplementedError
+    fetch_user(args.user)
 else:
     print("Nothing to do.")