From c515a2654fc922e9e1b072992bf6fd8fc84bc9f7 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 26 Mar 2020 14:37:46 +0100
Subject: [PATCH] OO-4584: delete recordings with the meeting in OpenOlat

---
 .../bigbluebutton/BigBlueButtonRecording.java |  2 +
 .../manager/BigBlueButtonManagerImpl.java     | 31 +++++++++++++
 .../manager/BigBlueButtonUtils.java           |  5 ++-
 .../model/BigBlueButtonRecordingImpl.java     | 13 ++++--
 .../ui/_i18n/LocalStrings_de.properties       |  3 +-
 .../ui/_i18n/LocalStrings_en.properties       |  1 +
 .../ui/_i18n/LocalStrings_fr.properties       | 43 ++++++++++++++++++-
 7 files changed, 90 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRecording.java b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRecording.java
index 77282cb99e1..384000083ec 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRecording.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/BigBlueButtonRecording.java
@@ -29,6 +29,8 @@ import java.util.Date;
  */
 public interface BigBlueButtonRecording {
 	
+	public String getRecordId();
+	
 	public String getUrl();
 	
 	public String getType();
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
index d64dcb0966f..29baa187fdd 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
@@ -290,10 +290,41 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 	public boolean deleteMeeting(BigBlueButtonMeeting meeting, BigBlueButtonErrors errors) {
 		BigBlueButtonMeeting reloadedMeeting = bigBlueButtonMeetingDao.loadByKey(meeting.getKey());
 		removeCalendarEvent(reloadedMeeting);
+		deleteRecordings(meeting, errors);
 		bigBlueButtonMeetingDao.deleteMeeting(reloadedMeeting);
 		return false;
 	}
 	
+	private void deleteRecordings(BigBlueButtonMeeting meeting, BigBlueButtonErrors errors) {
+		StringBuilder sb = new StringBuilder();
+		
+		List<BigBlueButtonRecording> recordings = getRecordings(meeting, errors);
+		if(recordings != null && !recordings.isEmpty()) {
+			for(BigBlueButtonRecording recording:recordings) {
+				String recordId = recording.getRecordId();
+				if(StringHelper.containsNonWhitespace(recordId)) {
+					if(sb.length() > 0) sb.append(",");
+					sb.append(recordId);
+				}
+			}
+		}
+		
+		if(sb.length() > 0) {
+			deleteRecording(sb.toString(), errors);
+		}
+	}
+	
+	private void deleteRecording(String recordId, BigBlueButtonErrors errors) {
+		BigBlueButtonUriBuilder uriBuilder = getUriBuilder();
+		uriBuilder
+			.operation("deleteRecordings")
+			.parameter("recordID", recordId);
+		
+		Document doc = sendRequest(uriBuilder, errors);
+		BigBlueButtonUtils.print(doc);
+		BigBlueButtonUtils.checkSuccess(doc, errors);
+	}
+	
 	private void removeCalendarEvent(BigBlueButtonMeeting meeting) {
 		Kalendar calendar = getCalendar(meeting);
 		if(calendar == null) return;
diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUtils.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUtils.java
index 92a6435d3ff..7535be26ba2 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUtils.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonUtils.java
@@ -106,7 +106,8 @@ public class BigBlueButtonUtils {
     	NodeList recordingList = document.getElementsByTagName("recording");
     	for(int i=recordingList.getLength(); i-->0; ) {
     		Element recordingEl = (Element)recordingList.item(i);
-    		String meetingId = getFirstElementValue(recordingEl, "meetingID");
+    		String recordId = getFirstElementValue(recordingEl, "recordID");
+    		String meetingId = getFirstElementValue(recordingEl, "meetingID"); 
     		String name = getFirstElementValue(recordingEl, "name");
     		Date startTime = toDate(getFirstElementValue(recordingEl, "startTime"));
     		Date endTime = toDate(getFirstElementValue(recordingEl, "endTime"));
@@ -119,7 +120,7 @@ public class BigBlueButtonUtils {
     				Element formatEl = (Element)formatList.item(k);
     				String url = getFirstElementValue(formatEl, "url");
     				String type = getFirstElementValue(formatEl, "type");
-    				recordings.add(BigBlueButtonRecordingImpl.valueOf(name, meetingId, startTime, endTime, url, type));
+    				recordings.add(BigBlueButtonRecordingImpl.valueOf(recordId, name, meetingId, startTime, endTime, url, type));
     			}
     		}
     	}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonRecordingImpl.java b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonRecordingImpl.java
index a54d2b42799..215259c2de7 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonRecordingImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonRecordingImpl.java
@@ -31,6 +31,7 @@ import org.olat.modules.bigbluebutton.BigBlueButtonRecording;
  */
 public class BigBlueButtonRecordingImpl implements BigBlueButtonRecording {
 	
+	private final String recordId;
 	private final String url;
 	private final String type;
 	private final String name;
@@ -39,7 +40,8 @@ public class BigBlueButtonRecordingImpl implements BigBlueButtonRecording {
 	private final Date start;
 	private final Date end;
 	
-	private BigBlueButtonRecordingImpl(String name, String meetingId, Date start, Date end, String url, String type) {
+	private BigBlueButtonRecordingImpl(String recordId, String name, String meetingId, Date start, Date end, String url, String type) {
+		this.recordId = recordId;
 		this.url = url;
 		this.type = type;
 		this.start = start;
@@ -48,10 +50,15 @@ public class BigBlueButtonRecordingImpl implements BigBlueButtonRecording {
 		this.meetingId = meetingId;
 	}
 	
-	public static BigBlueButtonRecording valueOf(String name, String meetingId, Date start, Date end, String url, String type) {
-		return new BigBlueButtonRecordingImpl(name, meetingId, start, end, url, type);
+	public static BigBlueButtonRecording valueOf(String recordId, String name, String meetingId, Date start, Date end, String url, String type) {
+		return new BigBlueButtonRecordingImpl(recordId, name, meetingId, start, end, url, type);
 	}
 	
+	@Override
+	public String getRecordId() {
+		return recordId;
+	}
+
 	@Override
 	public String getUrl() {
 		return url;
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
index 48d943e2baa..fd14056c80c 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
@@ -28,8 +28,9 @@ error.prefix=Ein Fehler ist aufgetreten\:
 error.server.raw={1} <small>Schl\u00FCssel\: {0}</small>
 error.start.after.end=Das Enddatum darf nicht vor dem Beginndatum sein.
 error.too.long.time=Zeit ist zu lang. Es sind maximal {0} Minuten erlaubt.
-meeting.create.intro=Der Online-Termin wurde vom Betreuer noch nicht er\u00f6ffnet. Teilnehmer k\u00F6nnen den Raum f\u00fcr noch nicht betreten.
+meeting.create.intro=Der Online-Termin wurde vom Betreuer noch nicht er\u00F6ffnet. Teilnehmer k\u00F6nnen den Raum f\u00fcr noch nicht betreten.
 meeting.description=Beschreibung
+meeting.deleted=Das Meeting wurde erfolgreich gel\u00F6scht.
 meeting.end=Ende
 meeting.ended=Der Online-Termin wurde bereits beendet.
 meeting.followupTime=Nachlaufzeit (Min.)
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
index 7d64804bda7..c88ff0d1b41 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
@@ -30,6 +30,7 @@ error.start.after.end=The end date must not be before the start date.
 error.too.long.time=Time is too long. It is limited to {0} minutes.
 meeting.create.intro=The meeting has not yet been started by the coach. Participants are not able to enter the classroom.
 meeting.description=Description
+meeting.deleted=The meeting was successfully deleted.
 meeting.end=End date
 meeting.ended=The online-meeting has already ended.
 meeting.followupTime=Follow-up (min.)
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
index 9aee62b80ba..a2782cc2526 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_fr.properties
@@ -1,15 +1,17 @@
-#Fri Mar 20 14:49:27 CET 2020
+#Thu Mar 26 14:36:51 CET 2020
 account.configuration=Configuration
 add.meeting=Ajouter un meeting
 add.template=Ajouter un mod\u00E8le
 admin.menu.title=BigBlueButton
 admin.menu.title.alt=BigBlueButton
-bigbluebutton.intro=Configuration de BigBlueButton, solution de conférences en ligne
+bigbluebutton.intro=Configuration de BigBlueButton, solution de conf\u00E9rences en ligne
 bigbluebutton.module.enabled=Module "BigBlueButton"
 bigbluebutton.module.enabled.for=Activer pour
 bigbluebutton.module.enabled.for.courses=Cours
 bigbluebutton.module.enabled.for.groups=Groupes
 bigbluebutton.title=BigBlueButton
+calendar.open=Voire les r\u00E9servations des salles
+calendar.title=Calendrier
 check=Tester la connection
 confirm.delete.meeting=Voulez-vous vraiment effacer le meeting "{0}"?
 confirm.delete.meeting.title=Effacer le meeting "{0}"
@@ -18,10 +20,16 @@ confirm.delete.template.title=Effacer le mod\u00E8le "{0}"
 connection.failed=L'authentification a \u00E9chou\u00E9e.
 connection.successful=L'authentication a r\u00E9ussi.
 edit.template=\u00C9diter le mod\u00E8le "{0}"
+enable.adhoc.meeting=Adhoc meeting en ligne
+enable.permanent.meeting=Meeting en ligne sans date
+error.duration=Dur\u00E9e du meeting est trop longue. Dur\u00E9e maximum\: {0} minutes.
+error.end.past=Un meeting en ligne ne peut pas \u00EAtre planifi\u00E9 dans le pass\u00E9.
 error.prefix=Une erreur s'est produite\:
 error.server.raw={1} <small>Cl\u00E9\: {0}</small>
 error.start.after.end=La date de fin du rendez-vous ne peut se trouver avant la date de d\u00E9but.
+error.too.long.time=Le temps est trop long. Il est limit\u00E9 \u00E0 {0} minutes.
 meeting.create.intro=Le meeting n'est pas encore disponible. Les participants \u00E0 cette classe ne peuvent pas encore y acc\u00E9der.
+meeting.deleted=Le meeting a \u00E9t\u00E9 effac\u00E9.
 meeting.description=Description
 meeting.end=Date de fin
 meeting.ended=Le meeting est termin\u00E9.
@@ -42,7 +50,9 @@ meetings.admin.title=Configuration
 meetings.past=Meetings anciens
 meetings.title=Meetings
 meetings.upcoming=Meetings \u00E0 venir
+minutes={0} min.
 no.meeting.configured=Aucun meeting n'a \u00E9t\u00E9 configur\u00E9 pour l'instant.
+no.recordings=Il n'y a pour l'instant pas d'enregistrements disponibles pour ce meeting.
 no.template.configured=Aucun mod\u00E8le n'a \u00E9t\u00E9 configur\u00E9 pour l'instant.
 no.upcoming.meetings=Vous n'avez pas meeting pr\u00E9vu \u00E0 l'avenir.
 option.baseurl=URL du serveur BigBlueButton
@@ -51,10 +61,39 @@ option.bigbluebutton.secret=Secret
 option.bigbluebutton.shared.secret=Secret partag\u00E9
 option.clean.meetings=Nettoy\u00E9 les meetings (jours)
 option.dont.clean.meetings=Jamais
+recording.browser.infos=Les enregistrements ne peuvent \u00EAtre vus qu'avec Google Chrome ou Firefox.
+recording.type.podcast=Podcast
+recording.type.presentation=Pr\u00E9sentation
+recordings=Enregistrements
+role.administrator=Administrateur
+role.author=Auteur
+role.coach=Coach
+role.group=Membre d'un groupe
+role.owner=Propri\u00E9taire de cours
+server.overloaded=Il n'y pas de salle de r\u00E9union disponible pour la p\u00E9riode choisie. Choisissez une autre date ou un autre mod\u00E8le de salle de r\u00E9union.
+table.header.enabled=Activ\u00E9
+table.header.max.concurrent.meetings=Salles de r\u00E9union
+table.header.max.duration=Dur\u00E9e
+table.header.max.participants=Participants
 table.header.permanent=Permanent
+table.header.recording.end=Fin
+table.header.recording.name=Nom
+table.header.recording.open=Ouvrir
+table.header.recording.start=D\u00E9but
+table.header.recording.type=Type
 table.header.system=Syst\u00E8me
+table.header.template=Mod\u00E8le de salle de r\u00E9union
+table.header.webcams.only.moderator=Webcam mod\u00E9rateurs seuls
+template.autoStartRecording=D\u00E9marrer automatiquement l'enregistrement
 template.description=Description
+template.enabled=Activer le mod\u00E8le de salle de r\u00E9union
+template.explain.max.participants=Nombre max. de participants\: {0} ({1} salles de r\u00E9union disponibles)
+template.explain.max.participants.with.webcams.mod=Nombre max. de participants\: {0}, webcam pour mod\u00E9rateurs seulement ({1} salles de r\u00E9union disponibles)
+template.max.concurrent.meetings=Nombre de salles de r\u00E9union
+template.maxDuration=Dur\u00E9e (minutes)
 template.maxParticipants=Nombre max. de participants
 template.name=Nom
 templates.title=Mod\u00E8les
+view=Regarder
+view.template=Mod\u00E8le de salle de r\u00E9union "{0}"
 warning.template.in.use=Le mod\u00E8le ne peut pas \u00EAtre effacer car il est encore utilis\u00E9.
-- 
GitLab