Skip to content

feat: The details of a meeting recording link to its event in the agenda EXO-92121 - #434

Merged
bmestrallet merged 4 commits into
feature/ai-contributionfrom
feat/EXO-92121-recording-event-link
Oct 27, 2026
Merged

bmestrallet merged 4 commits into
feature/ai-contributionfrom
feat/EXO-92121-recording-event-link

Conversation

@bmestrallet

@bmestrallet bmestrallet commented Oct 27, 2026 •

Copy link
Copy Markdown

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: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, 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 (ownerType space_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.
  • 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

…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>
@bmestrallet

Copy link
Copy Markdown
Author

Self-review close-out — EXO-92121 (agenda + web-conferencing + documents)

Round Finding Status
DC 🟠 agenda endpoint not no-store fixed, pinned
DC 🟡 LIKE ESCAPE verified on HSQLDB only verified by hand on MySQL 8.0 / PostgreSQL 16
DC 🟢 no-store not pinned on web-conferencing 204/refusals fixed
R1 🟠 occurrence window reduced to UTC dates (east-of-UTC mornings lost) fixed: dates in the series' zone, real recurrence engine in 6 zones
R1 🟡 moment/grace disagreed with the recordings list fixed: save date + configured grace, capped 168 h on both sides
R1 🟡 cost grew with the series' age fixed: distinct (link, series), only the window's occurrences read
R1 🟡 orphan Javadoc fixed
R1 🟡 line shows in the Documents app only decided: Documents app only (Benjamin)
R1 🟢 lookback bound undocumented / 🟢 history commits fixed
DC 🟡 an occurrence's own link may hold another call fixed: each candidate's own links checked
DC 🟡 contract text vs bounds (grace, 400 occurrences) fixed: bounds in the contract
R2 🟡 readZone Javadoc displaced / 🟢 constant Javadoc fixed
R3 closing round (fresh reviewer) CLEAN

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.
Suites: agenda-services 994/994, web-conferencing-services 82/82 (-Pcoverage, checks met); webapps build + lint clean.
Classification: agenda N1, web-conferencing N1, documents N3.

bmestrallet and others added 3 commits October 27, 2026 10:48
…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>
@bmestrallet

Copy link
Copy Markdown
Author

Post-review commits (after the close-out above), from the live check on the test server:

  • a0f1cb3c: the « Meeting » line registers under DocumentsInfoDetails (documents#2130's own slot name, strict-type) instead of DocumentsInfo, which the details menu also uses.
  • d2cb9bac: the value wraps instead of being cut with an ellipsis.
  • 188eaeeb: the event's title on a first line and its date on a second one, with no separator left at a line end; the label sits on the title's line (align-top, documents#2130).
    Checked live in the narrow drawer and the expanded view. The webapp build and lint are clean, and no Java changed since the close-out.

Base automatically changed from feat/EXO-91998-meeting-recordings to feature/ai-contribution October 27, 2026 11:38
@bmestrallet
bmestrallet merged commit c7cd9d1 into feature/ai-contribution Oct 27, 2026
1 check passed
@bmestrallet
bmestrallet deleted the feat/EXO-92121-recording-event-link branch October 27, 2026 14:03
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant