Repository navigation
feat: The details of a meeting recording link to its event in the agenda EXO-92121 - #434
Merged
bmestrallet merged 4 commits intoOct 27, 2026
Conversation
…nda EXO-92121 A recording opened in Documents now shows a « Meeting » line with the title and date of the agenda event it was made in, opening that event, or the occurrence of a recurring one. GET /webconferencing/rest/recordings/documents/{documentId}/call reads the file in the user's own session and answers the call its recording stamp holds: its id, provider, owner type, start and save dates, with the grace the recordings of an occurrence are listed with (occurrence-grace-hours, capped at 168 hours, the longest the agenda takes, so that both read the same occurrence). A link to a recording answers its target's call. A file the user cannot read, a file in the trash and a file with no stamp (any other file, or a recording saved before recordings were stamped) answer 204. Every answer is no-store. The line is the WebConferencingDocumentsExtension module of DocumentsGRP, contributed to the details rows (DocumentsInfo / documents-info-details), so it shows in the Documents app. For the call of an agenda event only, it asks the agenda which event the call was held for when the recording was saved, with that grace, so that it opens the occurrence whose recordings list holds the recording; it shows nothing when the agenda answers none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 27, 2026
Author
Self-review close-out — EXO-92121 (agenda + web-conferencing + documents)
Verified conform: per-reader ACL on every answered event (getEventById / getEventOccurrence, busy-time masked left out); file read in the viewer's own JCR session; identity from the request only; no Maven edge between agenda, web-conferencing and documents. |
…n point EXO-92121 The details rows of Documents have their own extension name, DocumentsInfoDetails; under DocumentsInfo the line also showed in the details menu, whose slot renders every component of that name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The details panel is narrow: the line now wraps, aligned to the start like the other rows, its date kept on one line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w, beside its label EXO-92121 Title on a first line, date on a second one, with no separator left at a line's end; the label is aligned with the title (align-top, documents#2130). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
|
Post-review commits (after the close-out above), from the live check on the test server:
|
Base automatically changed from
feat/EXO-91998-meeting-recordings
to
feature/ai-contribution
October 27, 2026 11:38
bmestrallet
added a commit
to exoplatform/agenda
that referenced
this pull request
Oct 27, 2026
…1244) ## Why A recording opened in Documents should say which meeting it was made in (EXO-92121). A recording knows its call; an agenda event knows its meeting only as a link holding the call identifier. Only the agenda can say which event, or which occurrence, a call belongs to, and whether the reader may see it. ## How - `GET /agenda/rest/conference-event?providerType&callId&moment[&graceHours]` (Spring MVC, `@Secured("users")`, `no-store`): 200 `{id, parentId, occurrenceId, title, start, end, allDay, url}` or 204. - `AgendaConferenceEventService` (new Spring `@Service`): - finds the meeting links of the type holding the call identifier as a whole path segment (`LIKE … ESCAPE '!'`, wildcards escaped, one row per link and series); - reads each candidate as the reader may (`getEventById` / `getEventOccurrence`), leaving out what they cannot read or read only as busy time; - an occurrence counts only when its own links hold the call (a stored occurrence may carry a link of its own); - for a recurring event, the occurrence dates are computed in the series' own time zone; the occurrence whose span extended by the grace holds the moment is answered, else the series. - Grace: 0–168 h, 12 by default, the same rule as the recordings list of an occurrence (web-conferencing `occurrence-grace-hours`). - Known limits (in the contract): an occurrence started more than grace + 36 h before the moment is not looked at; at most 400 occurrences of a series are, so a series recurring more often than hourly may answer an earlier occurrence or the series. - No schema change, no new Maven dependency. Tests: `EventConferenceDAOQueryTest` (the named query on HSQLDB, the escape also checked by hand on MySQL 8.0 and PostgreSQL 16), `AgendaConferenceEventServiceImplTest` (real recurrence engine, six time zones), `AgendaConferenceEventRestTest`; regression pins mutation-verified. Full `agenda-services` suite with `-Pcoverage`: 994/994. Used by exoplatform/web-conferencing#434 (the « Meeting » line of a recording's details), with exoplatform/documents#2130. Knowledge: Meeds-io/eng-standards#761 Classification: N1 (event ACL on a new REST lookup, a named query on a JPA entity) — computed at e5269ad. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
exo-swf
pushed a commit
to exoplatform/agenda
that referenced
this pull request
Oct 28, 2026
…1244) ## Why A recording opened in Documents should say which meeting it was made in (EXO-92121). A recording knows its call; an agenda event knows its meeting only as a link holding the call identifier. Only the agenda can say which event, or which occurrence, a call belongs to, and whether the reader may see it. ## How - `GET /agenda/rest/conference-event?providerType&callId&moment[&graceHours]` (Spring MVC, `@Secured("users")`, `no-store`): 200 `{id, parentId, occurrenceId, title, start, end, allDay, url}` or 204. - `AgendaConferenceEventService` (new Spring `@Service`): - finds the meeting links of the type holding the call identifier as a whole path segment (`LIKE … ESCAPE '!'`, wildcards escaped, one row per link and series); - reads each candidate as the reader may (`getEventById` / `getEventOccurrence`), leaving out what they cannot read or read only as busy time; - an occurrence counts only when its own links hold the call (a stored occurrence may carry a link of its own); - for a recurring event, the occurrence dates are computed in the series' own time zone; the occurrence whose span extended by the grace holds the moment is answered, else the series. - Grace: 0–168 h, 12 by default, the same rule as the recordings list of an occurrence (web-conferencing `occurrence-grace-hours`). - Known limits (in the contract): an occurrence started more than grace + 36 h before the moment is not looked at; at most 400 occurrences of a series are, so a series recurring more often than hourly may answer an earlier occurrence or the series. - No schema change, no new Maven dependency. Tests: `EventConferenceDAOQueryTest` (the named query on HSQLDB, the escape also checked by hand on MySQL 8.0 and PostgreSQL 16), `AgendaConferenceEventServiceImplTest` (real recurrence engine, six time zones), `AgendaConferenceEventRestTest`; regression pins mutation-verified. Full `agenda-services` suite with `-Pcoverage`: 994/994. Used by exoplatform/web-conferencing#434 (the « Meeting » line of a recording's details), with exoplatform/documents#2130. Knowledge: Meeds-io/eng-standards#761 Classification: N1 (event ACL on a new REST lookup, a named query on a JPA entity) — computed at e5269ad. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
exo-swf
pushed a commit
that referenced
this pull request
Oct 28, 2026
…nda EXO-92121 (#434) ## Why A meeting recording opened in Documents shows its length and transcript, but not the meeting it was recorded in (EXO-92121). The details panel now shows « Meeting: <event title> · <date> », opening the event in the agenda, or the occurrence of a recurring one. Stacked on #429 (the recording stamp `exo:callRecording` and `CallRecordingStorage`). ## How - `GET /webconferencing/rest/recordings/documents/{documentId}/call`: reads the file in the user's own JCR session (`readAs`, shared with `findRecordings`) and answers its stamp: `callId`, `providerType`, `ownerType`, `startedDate`, `recordedDate`, plus `graceHours`. A link to a recording answers its target's call. A file the user cannot read, in the trash, or without the stamp (any other file, a recording saved before stamping) answers 204. Every answer is `no-store`. - `occurrence-grace-hours` is capped at 168 h (with a WARN), the longest the agenda takes, so both read the same occurrence. - The line is a Vue component in a new `WebConferencingDocumentsExtension` module (`DocumentsGRP`), contributed to the details rows (`DocumentsInfoDetails` / `documents-info-details`, exoplatform/documents#2130). It shows the event's title on a first line and its date on a second one, its label aligned with the title (`align-top`). Only for an agenda-event call (`ownerType` `space_event`), it asks exoplatform/agenda#1244 for the event at the recording's save date with that grace; it shows nothing otherwise. No provider script is needed on the page. - Labels in `Visio_en.properties` only. - Scope: the line shows in the Documents app only (decided on the task); the details panel opened elsewhere (stream, notes, favorites) does not load the module. A call not started from an agenda event shows no line. Tests: `CallRecordingStorageTest`, `WebConferencingServiceRecordingsTest`, `CallRecordingRestTest` (new cases mutation-verified); full `web-conferencing-services` suite with `-Pcoverage`: 82/82; webapp build and lint clean. Knowledge: Meeds-io/eng-standards#761 Classification: N1 (a client-supplied document id read in a swapped ConversationState behind a new REST) — computed at a520552. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
boubaker
pushed a commit
to exoplatform/agenda
that referenced
this pull request
Oct 29, 2026
…1244) ## Why A recording opened in Documents should say which meeting it was made in (EXO-92121). A recording knows its call; an agenda event knows its meeting only as a link holding the call identifier. Only the agenda can say which event, or which occurrence, a call belongs to, and whether the reader may see it. ## How - `GET /agenda/rest/conference-event?providerType&callId&moment[&graceHours]` (Spring MVC, `@Secured("users")`, `no-store`): 200 `{id, parentId, occurrenceId, title, start, end, allDay, url}` or 204. - `AgendaConferenceEventService` (new Spring `@Service`): - finds the meeting links of the type holding the call identifier as a whole path segment (`LIKE … ESCAPE '!'`, wildcards escaped, one row per link and series); - reads each candidate as the reader may (`getEventById` / `getEventOccurrence`), leaving out what they cannot read or read only as busy time; - an occurrence counts only when its own links hold the call (a stored occurrence may carry a link of its own); - for a recurring event, the occurrence dates are computed in the series' own time zone; the occurrence whose span extended by the grace holds the moment is answered, else the series. - Grace: 0–168 h, 12 by default, the same rule as the recordings list of an occurrence (web-conferencing `occurrence-grace-hours`). - Known limits (in the contract): an occurrence started more than grace + 36 h before the moment is not looked at; at most 400 occurrences of a series are, so a series recurring more often than hourly may answer an earlier occurrence or the series. - No schema change, no new Maven dependency. Tests: `EventConferenceDAOQueryTest` (the named query on HSQLDB, the escape also checked by hand on MySQL 8.0 and PostgreSQL 16), `AgendaConferenceEventServiceImplTest` (real recurrence engine, six time zones), `AgendaConferenceEventRestTest`; regression pins mutation-verified. Full `agenda-services` suite with `-Pcoverage`: 994/994. Used by exoplatform/web-conferencing#434 (the « Meeting » line of a recording's details), with exoplatform/documents#2130. Knowledge: Meeds-io/eng-standards#761 Classification: N1 (event ACL on a new REST lookup, a named query on a JPA entity) — computed at e5269ad. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
A meeting recording opened in Documents shows its length and transcript, but not the meeting it was recorded in (EXO-92121). The details panel now shows « Meeting: · », opening the event in the agenda, or the occurrence of a recurring one.
Stacked on #429 (the recording stamp
exo:callRecordingandCallRecordingStorage).How
GET /webconferencing/rest/recordings/documents/{documentId}/call: reads the file in the user's own JCR session (readAs, shared withfindRecordings) and answers its stamp:callId,providerType,ownerType,startedDate,recordedDate, plusgraceHours. A link to a recording answers its target's call. A file the user cannot read, in the trash, or without the stamp (any other file, a recording saved before stamping) answers 204. Every answer isno-store.occurrence-grace-hoursis capped at 168 h (with a WARN), the longest the agenda takes, so both read the same occurrence.WebConferencingDocumentsExtensionmodule (DocumentsGRP), contributed to the details rows (DocumentsInfoDetails/documents-info-details, feat: Other add-ons can add rows to a file's details EXO-92121 documents#2130). It shows the event's title on a first line and its date on a second one, its label aligned with the title (align-top). Only for an agenda-event call (ownerTypespace_event), it asks feat: Find the event a web conferencing call was held for EXO-92121 agenda#1244 for the event at the recording's save date with that grace; it shows nothing otherwise. No provider script is needed on the page.Visio_en.propertiesonly.Tests:
CallRecordingStorageTest,WebConferencingServiceRecordingsTest,CallRecordingRestTest(new cases mutation-verified); fullweb-conferencing-servicessuite with-Pcoverage: 82/82; webapp build and lint clean.Knowledge: Meeds-io/eng-standards#761
Classification: N1 (a client-supplied document id read in a swapped ConversationState behind a new REST) — computed at a520552.
🤖 Generated with Claude Code