diff --git a/public/mod/bigbluebuttonbn/backup/moodle2/backup_bigbluebuttonbn_stepslib.php b/public/mod/bigbluebuttonbn/backup/moodle2/backup_bigbluebuttonbn_stepslib.php index 13a9ed2689d..29d14746bc3 100644 --- a/public/mod/bigbluebuttonbn/backup/moodle2/backup_bigbluebuttonbn_stepslib.php +++ b/public/mod/bigbluebuttonbn/backup/moodle2/backup_bigbluebuttonbn_stepslib.php @@ -63,7 +63,7 @@ class backup_bigbluebuttonbn_activity_structure_step extends backup_activity_str $recording = new backup_nested_element('recording', ['id'], [ 'courseid', 'bigbluebuttonbnid', 'groupid', 'recordingid', 'headlesss', 'imported', 'status', 'importeddata', - 'timecreated']); + 'timecreated', 'timemodified']); // Build the tree. $bigbluebuttonbn->add_child($logs); diff --git a/public/mod/bigbluebuttonbn/backup/moodle2/restore_bigbluebuttonbn_stepslib.php b/public/mod/bigbluebuttonbn/backup/moodle2/restore_bigbluebuttonbn_stepslib.php index ac546ae2b93..2d9462689eb 100644 --- a/public/mod/bigbluebuttonbn/backup/moodle2/restore_bigbluebuttonbn_stepslib.php +++ b/public/mod/bigbluebuttonbn/backup/moodle2/restore_bigbluebuttonbn_stepslib.php @@ -58,7 +58,6 @@ class restore_bigbluebuttonbn_activity_structure_step extends restore_activity_s global $DB; $data = (object) $data; $data->course = $this->get_courseid(); - $data->timemodified = $this->apply_date_offset($data->timemodified); // Check if we are in backup::MODE_IMPORT (we set a new meetingid) or backup::MODE_GENERAL (we keep the same meetingid). if ($this->get_task()->get_info()->mode == backup::MODE_IMPORT || empty($data->meetingid)) { // We are in backup::MODE_IMPORT, we need to renew the meetingid. @@ -83,7 +82,6 @@ class restore_bigbluebuttonbn_activity_structure_step extends restore_activity_s $data->courseid = $this->get_mappingid('course', $data->courseid); $data->bigbluebuttonbnid = $this->get_new_parentid('bigbluebuttonbn'); $data->userid = $this->get_mappingid('user', $data->userid); - $data->timecreated = $this->apply_date_offset($data->timecreated); // Insert the bigbluebuttonbn_logs record. $newitemid = $DB->insert_record('bigbluebuttonbn_logs', $data); // Immediately after inserting associated record, call this. @@ -102,7 +100,6 @@ class restore_bigbluebuttonbn_activity_structure_step extends restore_activity_s // Apply modifications. $data->courseid = $this->get_mappingid('course', $data->courseid); $data->bigbluebuttonbnid = $this->get_new_parentid('bigbluebuttonbn'); - $data->timecreated = $this->apply_date_offset($data->timecreated); // Insert the bigbluebuttonbn_recordings record. $newitemid = $DB->insert_record('bigbluebuttonbn_recordings', $data); // Immediately after inserting associated record, call this. diff --git a/public/mod/bigbluebuttonbn/tests/backup_restore_test.php b/public/mod/bigbluebuttonbn/tests/backup_restore_test.php index 2d666fffe12..96e169b0805 100644 --- a/public/mod/bigbluebuttonbn/tests/backup_restore_test.php +++ b/public/mod/bigbluebuttonbn/tests/backup_restore_test.php @@ -247,4 +247,72 @@ final class backup_restore_test extends restore_date_testcase { array_filter((array) $bbbdest, $filterfunction, ARRAY_FILTER_USE_KEY) ); } + + /** + * Test that timecreated and timemodified are the same during backup and restore. + * + * This confirms that apply_date_offset is NOT applied to these fields. + */ + public function test_backup_restore_time_dates(): void { + global $DB; + $this->resetAfterTest(); + + // Make an activity, a recording, and a log. + [$bbactivitycontext, $bbactivitycm, $bbactivity] = $this->create_instance($this->get_course()); + + // Due to mod_helper::process_pre_save_instance, any new instances have their timemodified set to zero. + // So manually update it here. + $DB->update_record('bigbluebuttonbn', ['id' => $bbactivity->id, 'timemodified' => time()]); + $bbactivity = $DB->get_record('bigbluebuttonbn', ['id' => $bbactivity->id]); + + $recording = new recording(0, (object)[ + 'courseid' => $this->get_course()->id, + 'bigbluebuttonbnid' => $bbactivity->id, + 'groupid' => 0, + 'recordingid' => '123456789', + 'imported' => 0, + 'status' => recording::RECORDING_STATUS_PROCESSED, + ]); + $recording->save(); + $log = $DB->get_record('bigbluebuttonbn_logs', ['courseid' => $this->get_course()->id]); + + $this->assertCount(1, $DB->get_records(recording::TABLE)); + $this->assertCount(1, $DB->get_records('bigbluebuttonbn_logs')); + $this->assertCount(1, $DB->get_records('bigbluebuttonbn')); + + $originalrecordingtimecreated = $recording->get('timecreated'); + $originalrecordingtimemodified = $recording->get('timemodified'); + $originalactivitytimecreated = $bbactivity->timecreated; + $originalactivitytimemodified = $bbactivity->timemodified; + $originallogtimecreated = $log->timecreated; + + // Update the course to have a start time in the future. + $testtime = time(); + $originalcoursestarttime = $testtime + YEARSECS; + $DB->update_record('course', ['id' => $this->get_course()->id, 'startdate' => $originalcoursestarttime]); + + // Backup and restore to new course, with a start date even later in the future. + $newcoursestartime = $testtime + 2 * YEARSECS; + $newcourseid = $this->backup_and_restore($this->get_course(), $newcoursestartime); + + // Sanity check the backup and restore was ok. + $this->assertCount(2, $DB->get_records(recording::TABLE)); + $this->assertCount(2, $DB->get_records('bigbluebuttonbn_logs')); + $this->assertCount(2, $DB->get_records('bigbluebuttonbn')); + + $newactivity = $DB->get_record('bigbluebuttonbn', ['course' => $newcourseid]); + $newlog = $DB->get_record('bigbluebuttonbn_logs', ['courseid' => $newcourseid]); + $newrecording = $DB->get_record(recording::TABLE, ['courseid' => $newcourseid]); + $this->assertNotEmpty($newactivity); + $this->assertNotEmpty($newlog); + $this->assertNotEmpty($newrecording); + + // Assert times is the same. + $this->assertEquals($originalrecordingtimecreated, $newrecording->timecreated); + $this->assertEquals($originalrecordingtimemodified, $newrecording->timemodified); + $this->assertEquals($originalactivitytimecreated, $newactivity->timecreated); + $this->assertEquals($originalactivitytimemodified, $newactivity->timemodified); + $this->assertEquals($originallogtimecreated, $newlog->timecreated); + // Note: Logs don't have a timemodified. + } }