+
+
+ {{ $t("rooms.phone.title") }}
+
+
@@ -72,6 +70,8 @@
/>
+
+
{{ $t("rooms.phone.note") }}
From 33fd2b7d1eb2cc768b4bed910625a18c734f9b07 Mon Sep 17 00:00:00 2001
From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com>
Date: Mon, 20 Jul 2026 15:11:41 +0200
Subject: [PATCH 06/12] Only store valid numbers
---
app/Http/Resources/LastMeetingResource.php | 2 +-
app/Services/RoomService.php | 9 +++++++--
resources/js/views/RoomsView.vue | 2 +-
3 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/app/Http/Resources/LastMeetingResource.php b/app/Http/Resources/LastMeetingResource.php
index dfca3feaab..1f600f9b68 100644
--- a/app/Http/Resources/LastMeetingResource.php
+++ b/app/Http/Resources/LastMeetingResource.php
@@ -24,7 +24,7 @@ public function toArray($request)
'usage' => $this->when($this->end == null, [
'participant_count' => $this->room->participant_count,
]),
- 'dial_in' => $this->when($this->end == null && ! in_array($this->dial_number, config('bigbluebutton.invalid_dial_numbers')), [
+ 'dial_in' => $this->when($this->end == null, [
'number' => $this->dial_number,
'pin' => $this->voice_bridge,
]),
diff --git a/app/Services/RoomService.php b/app/Services/RoomService.php
index 186cdda313..a61497410e 100644
--- a/app/Services/RoomService.php
+++ b/app/Services/RoomService.php
@@ -106,8 +106,13 @@ public function start(): MeetingService
// but the api call has not been completed yet therefore the meeting will not be found on the server
// and the server poller will mark the meeting as ended immediately
$meeting->start = date('Y-m-d H:i:s');
- $meeting->dial_number = $createMeetingResponse->getDialNumber();
- $meeting->voice_bridge = $createMeetingResponse->getVoiceBridge();
+
+ // Store dial-in number and voice-bridge (pin) if valid
+ if (! in_array($createMeetingResponse->getDialNumber(), config('bigbluebutton.invalid_dial_numbers'))) {
+ $meeting->dial_number = $createMeetingResponse->getDialNumber();
+ $meeting->voice_bridge = $createMeetingResponse->getVoiceBridge();
+ }
+
$meeting->save();
// Change latest meeting or the room to newly created meeting
diff --git a/resources/js/views/RoomsView.vue b/resources/js/views/RoomsView.vue
index af4a3526a8..716dcdf590 100644
--- a/resources/js/views/RoomsView.vue
+++ b/resources/js/views/RoomsView.vue
@@ -213,7 +213,7 @@
@changed="reload(true)"
/>
From b6526203d21ba8ac39a35a59d9354dae55ff6aeb Mon Sep 17 00:00:00 2001
From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com>
Date: Mon, 20 Jul 2026 15:11:51 +0200
Subject: [PATCH 07/12] Add backend tests
---
.../Backend/Feature/api/v1/Room/RoomTest.php | 50 ++++++++++++-
tests/Backend/Unit/RoomServiceTest.php | 73 +++++++++++++++++++
2 files changed, 121 insertions(+), 2 deletions(-)
create mode 100644 tests/Backend/Unit/RoomServiceTest.php
diff --git a/tests/Backend/Feature/api/v1/Room/RoomTest.php b/tests/Backend/Feature/api/v1/Room/RoomTest.php
index f871656ca6..d2830a7dd8 100644
--- a/tests/Backend/Feature/api/v1/Room/RoomTest.php
+++ b/tests/Backend/Feature/api/v1/Room/RoomTest.php
@@ -1592,7 +1592,7 @@ public function test_room_view()
]);
// Test with ended meeting
- $meeting = Meeting::factory()->create(['room_id' => $room->id]);
+ $meeting = Meeting::factory()->create(['room_id' => $room->id, 'dial_number' => '613-555-1234', 'voice_bridge' => '1234']);
$room->latestMeeting()->associate($meeting);
$room->save();
@@ -1608,9 +1608,10 @@ public function test_room_view()
],
],
])
+ ->assertJsonMissingPath('data.last_meeting.dial_in')
->assertJsonMissingPath('data.last_meeting.usage');
- // Test with running meeting and usage statistics
+ // Test with running meeting, usage statistics and dial-in
$meeting->end = null;
$meeting->save();
@@ -1626,11 +1627,56 @@ public function test_room_view()
'usage' => [
'participant_count' => 10,
],
+ 'dial_in' => [
+ 'number' => '613-555-1234',
+ 'pin' => '1234',
+ ],
],
],
])
->assertJsonCount(1, 'data.last_meeting.usage');
+ // Test without dial-in
+ $meeting->dial_number = null;
+ $meeting->voice_bridge = null;
+ $meeting->save();
+
+ $this->actingAs($this->user)->getJson(route('api.v1.rooms.show', ['room' => $room]))
+ ->assertStatus(200)
+ ->assertJson([
+ 'data' => [
+ 'last_meeting' => [
+ 'start' => $meeting->start->toJson(),
+ 'end' => null,
+ 'detached' => null,
+ 'server_connection_issues' => false,
+ 'usage' => [
+ 'participant_count' => 10,
+ ],
+ 'dial_in' => [
+ 'number' => null,
+ 'pin' => null,
+ ],
+ ],
+ ],
+ ]);
+
+ $this->actingAs($this->user)->getJson(route('api.v1.rooms.show', ['room' => $room]))
+ ->assertStatus(200)
+ ->assertJson([
+ 'data' => [
+ 'last_meeting' => [
+ 'start' => $meeting->start->toJson(),
+ 'end' => null,
+ 'detached' => null,
+ 'server_connection_issues' => false,
+ 'usage' => [
+ 'participant_count' => 10,
+ ],
+ ],
+ ],
+ ]);
+
// Test with server with connection issues
$meeting->server->error_count = 1;
$meeting->server->save();
diff --git a/tests/Backend/Unit/RoomServiceTest.php b/tests/Backend/Unit/RoomServiceTest.php
new file mode 100644
index 0000000000..6e6f0ef163
--- /dev/null
+++ b/tests/Backend/Unit/RoomServiceTest.php
@@ -0,0 +1,73 @@
+room = Room::factory()->create(['access_code' => '123456789']);
+ }
+
+ public function test_start_dial_in()
+ {
+ config(['bigbluebutton.invalid_dial_numbers' => ['0', '0000']]);
+
+ $server = Server::factory()->create();
+ $bbbFaker = new BigBlueButtonServerFaker($server->base_url, $server->secret);
+ $bbbFaker->addCreateMeetingRequest();
+ $bbbFaker->addCreateMeetingRequest();
+
+ $this->room->roomType->serverPool->servers()->attach($server);
+
+ // Start new meeting, result has a valid dial-in number
+ $roomService = new RoomService($this->room);
+ $roomService->start();
+
+ // Check meeting was created
+ $this->room->refresh();
+ $this->assertCount(1, $this->room->meetings);
+
+ // Check dial-in number and voice-bridge (pin) are set
+ $meeting = $this->room->latestMeeting;
+ $this->assertEquals('613-555-1234', $meeting->dial_number);
+ $this->assertEquals(92443, $meeting->voice_bridge);
+
+ // Set meeting as ended
+ $meetingService = new MeetingService($meeting);
+ $meetingService->setEnd();
+
+ // Change list of invalid dial-in numbers
+ config(['bigbluebutton.invalid_dial_numbers' => ['0', '0000', '613-555-1234']]);
+
+ // Start new meeting, result has an invalid dial-in number
+ $roomService->start();
+
+ // Check another meeting was created
+ $this->room->refresh();
+ $this->assertCount(2, $this->room->meetings);
+
+ // Check dial-in number and voice-bridge (pin) are not set
+ $meeting = $this->room->latestMeeting;
+ $this->assertNull($meeting->dial_number);
+ $this->assertNull($meeting->voice_bridge);
+ }
+}
From c847e24539d0333cd47e03ac7f679ae61e00af18 Mon Sep 17 00:00:00 2001
From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com>
Date: Mon, 20 Jul 2026 15:46:17 +0200
Subject: [PATCH 08/12] Add frontend tests
---
.../js/components/RoomJoinByPhoneButton.vue | 13 +++-
tests/Frontend/e2e/RoomsViewMeetings.cy.js | 73 ++++++++++++++++++
.../fixtures/files/dial-in-qr-code.png | Bin 0 -> 1770 bytes
3 files changed, 84 insertions(+), 2 deletions(-)
create mode 100644 tests/Frontend/fixtures/files/dial-in-qr-code.png
diff --git a/resources/js/components/RoomJoinByPhoneButton.vue b/resources/js/components/RoomJoinByPhoneButton.vue
index 78f8a44cc1..77f80090ab 100644
--- a/resources/js/components/RoomJoinByPhoneButton.vue
+++ b/resources/js/components/RoomJoinByPhoneButton.vue
@@ -1,13 +1,18 @@
-
+
-
![]()
+
{{ $t("rooms.phone.scan_qr_code") }}
diff --git a/tests/Frontend/e2e/RoomsViewMeetings.cy.js b/tests/Frontend/e2e/RoomsViewMeetings.cy.js
index bfe785dc41..30b4fbcb1f 100644
--- a/tests/Frontend/e2e/RoomsViewMeetings.cy.js
+++ b/tests/Frontend/e2e/RoomsViewMeetings.cy.js
@@ -1709,6 +1709,79 @@ describe("Rooms view meetings", function () {
);
});
+ it("join running meeting by phone", function () {
+ cy.fixture("room.json").then((room) => {
+ room.data.last_meeting = {
+ start: "2023-08-21T08:18:28.000000Z",
+ end: null,
+ dial_in: {
+ number: null,
+ pin: null,
+ },
+ };
+
+ cy.intercept("GET", "api/v1/rooms/abc-def-123", {
+ statusCode: 200,
+ body: room,
+ }).as("roomRequest");
+ });
+
+ cy.visit("/rooms/abc-def-123");
+
+ cy.wait("@roomRequest");
+
+ // Check if button is not shown, if no dial-number is set
+ cy.get('[data-test="room-join-by-phone-button"]').should("not.exist");
+
+ // Reload with dial-in
+ cy.fixture("room.json").then((room) => {
+ room.data.last_meeting = {
+ start: "2023-08-21T08:18:28.000000Z",
+ end: null,
+ dial_in: {
+ number: "+49 123 456789",
+ pin: "123456",
+ },
+ };
+
+ cy.intercept("GET", "api/v1/rooms/abc-def-123", {
+ statusCode: 200,
+ body: room,
+ }).as("roomRequest");
+ });
+
+ cy.reload();
+
+ cy.wait("@roomRequest");
+
+ cy.get('[data-test="room-join-by-phone-button"]')
+ .should("exist")
+ .should("have.text", "rooms.phone.join_by_phone")
+ .click();
+
+ cy.get('[data-test="room-join-by-phone-overlay"]')
+ .should("be.visible")
+ .within(() => {
+ cy.get("#phone-number").should("have.value", "+49 123 456789");
+ cy.get("#phone-pin").should("have.value", "123456");
+
+ cy.get('[data-test="join-by-phone-call-button"]')
+ .should("have.text", "rooms.phone.call")
+ .should("have.attr", "href", "tel:+49123456789,123456#");
+
+ cy.fixture("files/dial-in-qr-code.png", "base64").then(
+ (qrCodeImage) => {
+ cy.get('[data-test="join-by-phone-qr-code"]')
+ .should("be.visible")
+ .should("have.attr", "src")
+ .then((src) => {
+ expect(src).to.equal("data:image/png;base64," + qrCodeImage);
+ });
+ },
+ );
+ });
+ });
+
it("start meeting", function () {
const startRequest = interceptIndefinitely(
"POST",
diff --git a/tests/Frontend/fixtures/files/dial-in-qr-code.png b/tests/Frontend/fixtures/files/dial-in-qr-code.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f871d3519ef75be9e12ed58a9be95694c99a884
GIT binary patch
literal 1770
zcmbVNdsLDM7KhJ1!jDu=gE^VxN99D8S!1;&B_I@
KT@$<8U?Rd~w
zBp1WjJXkI+$|}il2q(N8FslZu%^!&VUbAI8^QJF;vI_RD<$sC*t>pJnaQp8=5J5h3
zhNGkrpKzHb(r3*D7G&*KA1pMD1vn#NcS}ThYdm
zt_jBEcjskf{1b=iawV5msEC>F+9+XKIOGN^JS}IvD9K*1lL(ehgS*{n!;@&V5nJAHBRf!
z@;An_1V1GgQaeQVqBnv?h9mW_2}cms6F>8S;NBlcaonMGk^^UtzDVH2eXxF3l<{qie0vy}?>DHdD2D(F!#yv9^)$?-2*wVdIzHU&ONXW}VPLdY!sCDP1qs
zo2M4Rzx^mv5`(}JVz7ro{P+6QO>3`Y6Zz%_i~TX1KpfK=^JD<%PFgn7yXMV&fScpn
zIC{Al^bOzQ_}f3V441}dcf@%OI?A#=57%7Q(*}zj#)A@96}k?Qo;D2vtFZs*ejbGY
zV%vU?;`Za{GK$l}WG-5?G9z+&keCexnsk=Cj2s#PWh5WWvE=Vd!So0-6k}b}C~h{e
zom}J0arc{0^leO*knzhwh$*@2B%ce^9Nt~5j}53b4Nw4W{GBlCj-?sF4sIt#pxpgwTQIq%PnpeSC*u(fuY-1la^N7`7
zZTBcE7+2V-5$L2k;iRI~3A>=VdP~Xee!({3-|wI{aLYU{0WQYhwzcH{8Rhv7zu~T3
z&eqIo<0kPg5v~#$@6}hNn=s-1lyrdTx4;qZq5^klPlwb&;6{oguf|DE&*kDDq?RkM
z*VFc{b#QO@qM+#>Sx`=eqE@&@R5JSR-ma*guGVSp`_)@NV
zuiM$5fc-!UkIUtve$YrA%OCd(
zVjp%y|149A!;&R}ildU8E<)wfmHrnVE;&X3
literal 0
HcmV?d00001
From df0ffbad72636380ab39827d4346e6dba6b466b8 Mon Sep 17 00:00:00 2001
From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com>
Date: Mon, 20 Jul 2026 15:49:35 +0200
Subject: [PATCH 09/12] Adjust changelog
---
CHANGELOG.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 606f62e591..6d7968e7c7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Environment variable `VERSION` to change the displayed version in the footer ([#3300], [#3302])
- System-wide default welcome message ([#3301])
+- Popover to show dial-in number and pin during a running meeting ([#1143], [#1810])
### Fixed
@@ -661,6 +662,7 @@ You can find the changelog for older versions there [here](https://github.com/TH
[#1120]: https://github.com/THM-Health/PILOS/pull/1120
[#1126]: https://github.com/THM-Health/PILOS/pull/1126
[#1133]: https://github.com/THM-Health/PILOS/pull/1133
+[#1143]: https://github.com/THM-Health/PILOS/issues/1143
[#1150]: https://github.com/THM-Health/PILOS/issues/1150
[#1159]: https://github.com/THM-Health/PILOS/pull/1159
[#1166]: https://github.com/THM-Health/PILOS/pull/1166
@@ -731,6 +733,7 @@ You can find the changelog for older versions there [here](https://github.com/TH
[#1795]: https://github.com/THM-Health/PILOS/pull/1795
[#1801]: https://github.com/THM-Health/PILOS/pull/1801
[#1802]: https://github.com/THM-Health/PILOS/pull/1802
+[#1810]: https://github.com/THM-Health/PILOS/pull/1810
[#1811]: https://github.com/THM-Health/PILOS/pull/1811
[#1824]: https://github.com/THM-Health/PILOS/issues/1824
[#1825]: https://github.com/THM-Health/PILOS/pull/1825
From 15e04408cdd595f76a85ef7bb5701b3074b2f089 Mon Sep 17 00:00:00 2001
From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com>
Date: Mon, 20 Jul 2026 16:10:46 +0200
Subject: [PATCH 10/12] Fix cs
---
resources/js/components/RoomJoinByPhoneButton.vue | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/resources/js/components/RoomJoinByPhoneButton.vue b/resources/js/components/RoomJoinByPhoneButton.vue
index 77f80090ab..6ec77b7644 100644
--- a/resources/js/components/RoomJoinByPhoneButton.vue
+++ b/resources/js/components/RoomJoinByPhoneButton.vue
@@ -1,11 +1,10 @@
-
Date: Mon, 20 Jul 2026 17:48:10 +0200
Subject: [PATCH 11/12] Change voiceBride type from int to string
---
..._171150_add_dial_in_to_meetings_table.php} | 2 +-
.../Backend/Feature/api/v1/Room/RoomTest.php | 20 +++++++++----------
tests/Backend/Unit/RoomServiceTest.php | 2 +-
.../Utils/BigBlueButtonServerFaker.php | 2 +-
tests/Frontend/e2e/RoomsViewMeetings.cy.js | 6 +++---
5 files changed, 16 insertions(+), 16 deletions(-)
rename database/migrations/{2024_06_12_171150_add_dial_in_to_meetings_table.php => 2026_07_20_171150_add_dial_in_to_meetings_table.php} (92%)
diff --git a/database/migrations/2024_06_12_171150_add_dial_in_to_meetings_table.php b/database/migrations/2026_07_20_171150_add_dial_in_to_meetings_table.php
similarity index 92%
rename from database/migrations/2024_06_12_171150_add_dial_in_to_meetings_table.php
rename to database/migrations/2026_07_20_171150_add_dial_in_to_meetings_table.php
index 5fce22858f..bca65c8220 100644
--- a/database/migrations/2024_06_12_171150_add_dial_in_to_meetings_table.php
+++ b/database/migrations/2026_07_20_171150_add_dial_in_to_meetings_table.php
@@ -15,7 +15,7 @@ public function up(): void
{
Schema::table('meetings', function (Blueprint $table) {
$table->string('dial_number')->nullable();
- $table->integer('voice_bridge')->nullable();
+ $table->string('voice_bridge')->nullable();
});
}
diff --git a/tests/Backend/Feature/api/v1/Room/RoomTest.php b/tests/Backend/Feature/api/v1/Room/RoomTest.php
index d2830a7dd8..872054f251 100644
--- a/tests/Backend/Feature/api/v1/Room/RoomTest.php
+++ b/tests/Backend/Feature/api/v1/Room/RoomTest.php
@@ -1592,7 +1592,7 @@ public function test_room_view()
]);
// Test with ended meeting
- $meeting = Meeting::factory()->create(['room_id' => $room->id, 'dial_number' => '613-555-1234', 'voice_bridge' => '1234']);
+ $meeting = Meeting::factory()->create(['room_id' => $room->id, 'dial_number' => '613-555-1234', 'voice_bridge' => '01234']);
$room->latestMeeting()->associate($meeting);
$room->save();
@@ -1629,7 +1629,7 @@ public function test_room_view()
],
'dial_in' => [
'number' => '613-555-1234',
- 'pin' => '1234',
+ 'pin' => '01234',
],
],
],
@@ -3895,7 +3895,7 @@ public function test_server_usage_update_during_room_start()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
@@ -3976,7 +3976,7 @@ public function test_room_start_during_server_usage_update()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
@@ -4188,7 +4188,7 @@ public function test_join()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
@@ -4597,7 +4597,7 @@ public function test_join_url()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
@@ -4743,7 +4743,7 @@ public function test_join_url_dark_mode()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
@@ -4846,7 +4846,7 @@ public function test_join_record()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
@@ -4979,7 +4979,7 @@ public function test_join_attendance_recording()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
@@ -5101,7 +5101,7 @@ public function test_join_streaming()
5400b2af9176c1be733b9a4f1adbc7fb41a72123-1624606850899
1624606850899
Fri Jun 25 09:40:50 CEST 2021
- 70663
+ 00663
613-555-1234
true
0
diff --git a/tests/Backend/Unit/RoomServiceTest.php b/tests/Backend/Unit/RoomServiceTest.php
index 6e6f0ef163..606e9cb0ba 100644
--- a/tests/Backend/Unit/RoomServiceTest.php
+++ b/tests/Backend/Unit/RoomServiceTest.php
@@ -49,7 +49,7 @@ public function test_start_dial_in()
// Check dial-in number and voice-bridge (pin) are set
$meeting = $this->room->latestMeeting;
$this->assertEquals('613-555-1234', $meeting->dial_number);
- $this->assertEquals(92443, $meeting->voice_bridge);
+ $this->assertEquals('02443', $meeting->voice_bridge);
// Set meeting as ended
$meetingService = new MeetingService($meeting);
diff --git a/tests/Backend/Utils/BigBlueButtonServerFaker.php b/tests/Backend/Utils/BigBlueButtonServerFaker.php
index 77ab65df79..1eece7d322 100644
--- a/tests/Backend/Utils/BigBlueButtonServerFaker.php
+++ b/tests/Backend/Utils/BigBlueButtonServerFaker.php
@@ -128,7 +128,7 @@ public static function createCreateMeetingResponse(Request $request): PromiseInt
5756487f8952a40879db59f8fe4085798cb79ccc-1695892370102
bbb-none
1695892370102
- 92443
+ 02443
613-555-1234
Thu Sep 28 09:12:50 UTC 2023
false
diff --git a/tests/Frontend/e2e/RoomsViewMeetings.cy.js b/tests/Frontend/e2e/RoomsViewMeetings.cy.js
index 30b4fbcb1f..897f1d79b2 100644
--- a/tests/Frontend/e2e/RoomsViewMeetings.cy.js
+++ b/tests/Frontend/e2e/RoomsViewMeetings.cy.js
@@ -1740,7 +1740,7 @@ describe("Rooms view meetings", function () {
end: null,
dial_in: {
number: "+49 123 456789",
- pin: "123456",
+ pin: "01234",
},
};
@@ -1763,11 +1763,11 @@ describe("Rooms view meetings", function () {
.should("be.visible")
.within(() => {
cy.get("#phone-number").should("have.value", "+49 123 456789");
- cy.get("#phone-pin").should("have.value", "123456");
+ cy.get("#phone-pin").should("have.value", "01234");
cy.get('[data-test="join-by-phone-call-button"]')
.should("have.text", "rooms.phone.call")
- .should("have.attr", "href", "tel:+49123456789,123456#");
+ .should("have.attr", "href", "tel:+49123456789,01234#");
cy.fixture("files/dial-in-qr-code.png", "base64").then(
(qrCodeImage) => {
From 3e379454b1943b184e8caa7e7211b56d76a0170f Mon Sep 17 00:00:00 2001
From: Samuel Weirich <4281791+SamuelWei@users.noreply.github.com>
Date: Mon, 20 Jul 2026 17:48:32 +0200
Subject: [PATCH 12/12] Move BBB api from littleredbutton to own fork
---
composer.json | 2 +-
composer.lock | 264 +++++++++++++++++++++++++-------------------------
2 files changed, 133 insertions(+), 133 deletions(-)
diff --git a/composer.json b/composer.json
index b46c6c3c5f..64baabb667 100644
--- a/composer.json
+++ b/composer.json
@@ -25,7 +25,6 @@
"laravel/sanctum": "^v4.0",
"laravel/telescope": "^5.0",
"laravel/tinker": "^3.0",
- "littleredbutton/bigbluebutton-api-php": "^6.0",
"maennchen/zipstream-php": "^3.1",
"nunomaduro/collision": "^8.1",
"phpoffice/phpspreadsheet": "^5.7",
@@ -37,6 +36,7 @@
"spatie/laravel-ignition": "^2.0",
"spatie/laravel-settings": "^3.3",
"symfony/var-exporter": "8.0.14",
+ "thm-health/bigbluebutton-api-php": "^7.0",
"web-token/jwt-framework": "^4.0"
},
"require-dev": {
diff --git a/composer.lock b/composer.lock
index 6f7d112875..09a79c8892 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "ecc5d9539071da996f342f1503989263",
+ "content-hash": "526224e1bf2dff2a18e983daeb9384e5",
"packages": [
{
"name": "bacon/bacon-qr-code",
@@ -3015,137 +3015,6 @@
],
"time": "2026-03-08T20:05:35+00:00"
},
- {
- "name": "littleredbutton/bigbluebutton-api-php",
- "version": "6.2.2",
- "source": {
- "type": "git",
- "url": "https://github.com/littleredbutton/bigbluebutton-api-php.git",
- "reference": "0178d70c05c2bcf35efbfe57a423e068c6edb15e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/littleredbutton/bigbluebutton-api-php/zipball/0178d70c05c2bcf35efbfe57a423e068c6edb15e",
- "reference": "0178d70c05c2bcf35efbfe57a423e068c6edb15e",
- "shasum": ""
- },
- "require": {
- "ext-curl": "*",
- "ext-dom": "*",
- "ext-json": "*",
- "ext-mbstring": "*",
- "ext-simplexml": "*",
- "php": ">=8.1"
- },
- "require-dev": {
- "nyholm/psr7": "^1.4",
- "psr/http-client": "^1.0",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.0 || ^2.0",
- "symfony/dotenv": "^5.4|^6.4|^7.0",
- "symfony/http-client": "^5.4|^6.4|^7.0",
- "symfony/http-client-contracts": "^1.1|^2.0|^3.0",
- "symfony/process": "^5.4|^6.4|^7.0"
- },
- "suggest": {
- "psr/http-client-implementation": "To use the PsrHttpClientTransport.",
- "psr/http-factory-implementation": "To use the PsrHttpClientTransport.",
- "psr/http-message": "To use the PsrClientHttpTransport.",
- "symfony/http-client": "To use the SymfonyHttpClientTransport.",
- "symfony/http-client-contracts": "To use the SymfonyHttpClientTransport."
- },
- "type": "library",
- "extra": {
- "cotor": {
- "extensions": {
- "phpunit/phpunit": {
- "fakerphp/faker": "1.20.*"
- }
- },
- "vimeo/psalm": "^5.23",
- "rector/rector": "^1.0",
- "phpstan/phpstan": "^1.10",
- "phpunit/phpunit": "^9",
- "friendsofphp/php-cs-fixer": "^3.3",
- "brainmaestro/composer-git-hooks": "^2.8"
- },
- "hooks": {
- "pre-push": [
- "tools/phpunit --testsuite=\"BigBlueButton unit test suite,BigBlueButton integration test suite\"",
- "tools/psalm --threads=1",
- "tools/phpstan analyse",
- "tools/rector process --dry-run src/ tests/"
- ],
- "post-merge": "composer install",
- "pre-commit": [
- "tools/php-cs-fixer fix --dry-run --allow-risky=yes"
- ],
- "post-checkout": "composer install"
- }
- },
- "autoload": {
- "psr-4": {
- "BigBlueButton\\": [
- "src",
- "tests/integration"
- ]
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0-or-later"
- ],
- "authors": [
- {
- "name": "Ghazi Triki",
- "email": "ghazi.triki@riadvice.tn",
- "role": "Developer"
- },
- {
- "name": "Klaus Herberth",
- "email": "klaus@jsxc.org",
- "role": "Developer"
- },
- {
- "name": "Samuel Weirich",
- "email": "samuel@coding-space.de",
- "role": "Developer"
- },
- {
- "name": "Jignesh Joisar",
- "email": "jigneshjoisar@gmail.com",
- "role": "Developer"
- },
- {
- "name": "Pablo Ogando",
- "email": "pablo.ogando@teltek.es",
- "role": "Developer"
- },
- {
- "name": "Alfonso RodrÃguez",
- "email": "arodriguez@teltek.es",
- "role": "Developer"
- },
- {
- "name": "Felix Jacobi",
- "email": "felix@jacobi-hamburg.net",
- "role": "Developer"
- }
- ],
- "description": "BigBlueButton PHP API Library for PHP",
- "homepage": "http://bigbluebutton.org/",
- "keywords": [
- "api",
- "bbb",
- "bigbluebutton"
- ],
- "support": {
- "docs": "https://github.com/littleredbutton/bigbluebutton-api-php/blob/master/README.md",
- "issues": "https://github.com/littleredbutton/bigbluebutton-api-php/issues",
- "source": "https://github.com/littleredbutton/bigbluebutton-api-php/"
- },
- "time": "2025-11-17T12:30:55+00:00"
- },
{
"name": "livewire/livewire",
"version": "v4.3.3",
@@ -9653,6 +9522,137 @@
],
"time": "2026-06-27T08:56:37+00:00"
},
+ {
+ "name": "thm-health/bigbluebutton-api-php",
+ "version": "7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/THM-Health/bigbluebutton-api-php.git",
+ "reference": "016e2097a8b60e60af4ca47188f6e32212a9718a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/THM-Health/bigbluebutton-api-php/zipball/016e2097a8b60e60af4ca47188f6e32212a9718a",
+ "reference": "016e2097a8b60e60af4ca47188f6e32212a9718a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-curl": "*",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-simplexml": "*",
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.4",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/dotenv": "^5.4|^6.4|^7.0",
+ "symfony/http-client": "^5.4|^6.4|^7.0",
+ "symfony/http-client-contracts": "^1.1|^2.0|^3.0",
+ "symfony/process": "^5.4|^6.4|^7.0"
+ },
+ "suggest": {
+ "psr/http-client-implementation": "To use the PsrHttpClientTransport.",
+ "psr/http-factory-implementation": "To use the PsrHttpClientTransport.",
+ "psr/http-message": "To use the PsrClientHttpTransport.",
+ "symfony/http-client": "To use the SymfonyHttpClientTransport.",
+ "symfony/http-client-contracts": "To use the SymfonyHttpClientTransport."
+ },
+ "type": "library",
+ "extra": {
+ "cotor": {
+ "extensions": {
+ "phpunit/phpunit": {
+ "fakerphp/faker": "1.24.*"
+ }
+ },
+ "vimeo/psalm": "^5.23",
+ "rector/rector": "^1.0",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10",
+ "friendsofphp/php-cs-fixer": "^3.3",
+ "brainmaestro/composer-git-hooks": "^2.8"
+ },
+ "hooks": {
+ "pre-push": [
+ "tools/phpunit --testsuite=\"BigBlueButton unit test suite,BigBlueButton integration test suite\"",
+ "tools/psalm --threads=1",
+ "tools/phpstan analyse",
+ "tools/rector process --dry-run src/ tests/"
+ ],
+ "post-merge": "composer install",
+ "pre-commit": [
+ "tools/php-cs-fixer fix --dry-run --allow-risky=yes"
+ ],
+ "post-checkout": "composer install"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "BigBlueButton\\": [
+ "src",
+ "tests/integration"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Ghazi Triki",
+ "email": "ghazi.triki@riadvice.tn",
+ "role": "Developer"
+ },
+ {
+ "name": "Klaus Herberth",
+ "email": "klaus@jsxc.org",
+ "role": "Developer"
+ },
+ {
+ "name": "Samuel Weirich",
+ "email": "samuel@coding-space.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Jignesh Joisar",
+ "email": "jigneshjoisar@gmail.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Pablo Ogando",
+ "email": "pablo.ogando@teltek.es",
+ "role": "Developer"
+ },
+ {
+ "name": "Alfonso RodrÃguez",
+ "email": "arodriguez@teltek.es",
+ "role": "Developer"
+ },
+ {
+ "name": "Felix Jacobi",
+ "email": "felix@jacobi-hamburg.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "BigBlueButton PHP API Library for PHP",
+ "homepage": "http://bigbluebutton.org/",
+ "keywords": [
+ "api",
+ "bbb",
+ "bigbluebutton"
+ ],
+ "support": {
+ "docs": "https://github.com/littleredbutton/bigbluebutton-api-php/blob/master/README.md",
+ "issues": "https://github.com/littleredbutton/bigbluebutton-api-php/issues",
+ "source": "https://github.com/littleredbutton/bigbluebutton-api-php/"
+ },
+ "time": "2026-07-20T15:30:51+00:00"
+ },
{
"name": "tijsverkoyen/css-to-inline-styles",
"version": "v2.4.0",