Skip to content

Commit 7becc53

Browse files
authored
feat(meetings): itx migration phase 2 - identifier renames (#243)
* feat(meetings): itx migration phase 2 - identifier renames LFXV2-1097 LFXV2-1098 LFXV2-1099 LFXV2-1100 - Rename Meeting.uid to Meeting.id across all interfaces, components, and services - Rename meeting_uid to meeting_id and past_meeting_uid to past_meeting_id - Update query service tag strings to use meeting_id - Fix query service resource ID prefix (v1_meeting:xxx) leaking into meeting.id - Fix meeting form sending recording-dependent fields when recording is disabled - Remove isLegacyMeeting signal and version gates from meeting components - Remove dead V1 legacy interfaces and transform utilities - Clean up server controllers to remove version branching - Update access-check service to support both uid and id resource patterns Signed-off-by: Asitha de Silva <asithade@gmail.com> * fix(meetings): show_meeting_attendees and access check fixes LFXV2-1097 - Use meeting.show_meeting_attendees from API instead of hardcoding true - Disable Show Members button when show_meeting_attendees is off - Pass meetingType to access check in getMeetingById - Remove unused NgClass and FileSizePipe imports - Collapse multi-line imports to single lines Signed-off-by: Asitha de Silva <asithade@gmail.com> --------- Signed-off-by: Asitha de Silva <asithade@gmail.com>
1 parent 46f57ae commit 7becc53

File tree

38 files changed

+450
-1150
lines changed

38 files changed

+450
-1150
lines changed

apps/lfx-one/src/app/modules/committees/components/upcoming-committee-meeting/upcoming-committee-meeting.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<div class="flex flex-col gap-2">
66
<div class="flex items-center justify-between">
77
<a
8-
[routerLink]="['/project', project()?.slug, 'meetings', upcomingMeeting()!.uid]"
8+
[routerLink]="['/project', project()?.slug, 'meetings', upcomingMeeting()!.id]"
99
class="text-sm font-medium text-primary hover:text-primary-600 hover:underline line-clamp-2"
1010
[pTooltip]="upcomingMeeting()!.title || 'Meeting'">
1111
{{ upcomingMeeting()!.title || 'Meeting' }}

apps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
<div class="flex items-center gap-1 flex-shrink-0 mt-0.5">
9898
@for (attachment of attachments(); track attachment.uid; let index = $index) {
9999
<a
100-
[href]="attachment.type === 'link' ? attachment.link : '/api/meetings/' + meeting().uid + '/attachments/' + attachment.uid"
100+
[href]="attachment.type === 'link' ? attachment.link : '/api/meetings/' + meeting().id + '/attachments/' + attachment.uid"
101101
target="_blank"
102102
rel="noopener noreferrer"
103103
[download]="attachment.type === 'file' ? attachment.name : null"

apps/lfx-one/src/app/modules/dashboards/components/dashboard-meeting-card/dashboard-meeting-card.component.ts

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,15 @@ export class DashboardMeetingCardComponent {
5454

5555
public readonly hasAiSummary: Signal<boolean> = this.initHasAiSummary();
5656
public readonly meetingTitle: Signal<string> = this.initMeetingTitle();
57-
public readonly isLegacyMeeting: Signal<boolean> = this.initIsLegacyMeeting();
5857
public readonly isRecurring: Signal<boolean> = this.initIsRecurring();
5958
public readonly meetingDetailUrl: Signal<string> = this.initMeetingDetailUrl();
6059

6160
public constructor() {
6261
const meeting$ = toObservable(this.meeting);
6362
const attachments$ = meeting$.pipe(
6463
switchMap((meeting) => {
65-
if (meeting?.uid) {
66-
return this.meetingService.getMeetingAttachments(meeting.uid).pipe(catchError(() => of([])));
64+
if (meeting?.id) {
65+
return this.meetingService.getMeetingAttachments(meeting.id).pipe(catchError(() => of([])));
6766
}
6867
return of([]);
6968
})
@@ -73,18 +72,21 @@ export class DashboardMeetingCardComponent {
7372

7473
const user$ = toObservable(this.userService.user);
7574
const authenticated$ = toObservable(this.userService.authenticated);
76-
const isLegacyMeeting$ = toObservable(this.isLegacyMeeting);
7775

78-
const joinUrl$ = combineLatest([meeting$, user$, authenticated$, isLegacyMeeting$]).pipe(
79-
switchMap(([meeting, user, authenticated, isLegacy]) => {
80-
// For v1 meetings, use the join_url directly from the meeting object
81-
if (isLegacy && meeting.join_url && this.canJoinMeeting()) {
82-
return of(meeting.join_url);
76+
const joinUrl$ = combineLatest([meeting$, user$, authenticated$]).pipe(
77+
switchMap(([meeting, user, authenticated]) => {
78+
if (!meeting.id || !this.canJoinMeeting()) {
79+
return of(null);
8380
}
8481

85-
// For v2 meetings, fetch join URL from API for authenticated users
86-
if (meeting.uid && authenticated && user?.email && this.canJoinMeeting()) {
87-
return this.meetingService.getPublicMeetingJoinUrl(meeting.uid, meeting.password, { email: user.email }).pipe(
82+
// Use public_link directly if available (e.g. for legacy meetings with join_url from query service)
83+
if (meeting.public_link) {
84+
return of(meeting.public_link);
85+
}
86+
87+
// Otherwise fetch join URL from API for authenticated users
88+
if (authenticated && user?.email) {
89+
return this.meetingService.getPublicMeetingJoinUrl(meeting.id, meeting.password, { email: user.email }).pipe(
8890
map((res) => buildJoinUrlWithParams(res.join_url, user)),
8991
catchError(() => of(null))
9092
);
@@ -235,10 +237,6 @@ export class DashboardMeetingCardComponent {
235237
});
236238
}
237239

238-
private initIsLegacyMeeting(): Signal<boolean> {
239-
return computed(() => this.meeting().version === 'v1');
240-
}
241-
242240
private initIsRecurring(): Signal<boolean> {
243241
return computed(() => !!this.meeting().recurrence);
244242
}
@@ -252,12 +250,8 @@ export class DashboardMeetingCardComponent {
252250
params.set('password', meeting.password);
253251
}
254252

255-
if (this.isLegacyMeeting()) {
256-
params.set('v1', 'true');
257-
}
258-
259253
const queryString = params.toString();
260-
return queryString ? `/meetings/${meeting.uid}?${queryString}` : `/meetings/${meeting.uid}`;
254+
return queryString ? `/meetings/${meeting.id}?${queryString}` : `/meetings/${meeting.id}`;
261255
});
262256
}
263257
}

apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ <h2 class="flex items-center gap-2">
3838
class="-mt-2 py-2"
3939
[meeting]="item.meeting"
4040
[occurrence]="item.occurrence"
41-
[attr.data-testid]="'dashboard-my-meetings-today-item-' + item.meeting.uid" />
41+
[attr.data-testid]="'dashboard-my-meetings-today-item-' + item.meeting.id" />
4242
}
4343
</div>
4444
</div>
@@ -52,7 +52,7 @@ <h2 class="flex items-center gap-2">
5252
<lfx-dashboard-meeting-card
5353
[meeting]="item.meeting"
5454
[occurrence]="item.occurrence"
55-
[attr.data-testid]="'dashboard-my-meetings-upcoming-item-' + item.meeting.uid" />
55+
[attr.data-testid]="'dashboard-my-meetings-upcoming-item-' + item.meeting.id" />
5656
}
5757
</div>
5858
</div>

apps/lfx-one/src/app/modules/dashboards/components/my-meetings/my-meetings.component.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export class MyMeetingsComponent {
6666
meeting,
6767
occurrence: todayOccurrence,
6868
sortTime: startTimeMs,
69-
trackId: meeting.uid,
69+
trackId: meeting.id,
7070
});
7171
}
7272
} else {
@@ -87,7 +87,7 @@ export class MyMeetingsComponent {
8787
duration: meeting.duration,
8888
},
8989
sortTime: startTimeMs,
90-
trackId: meeting.uid,
90+
trackId: meeting.id,
9191
});
9292
}
9393
}
@@ -126,7 +126,7 @@ export class MyMeetingsComponent {
126126
meeting,
127127
occurrence: upcomingOccurrence,
128128
sortTime: startTimeMs,
129-
trackId: meeting.uid,
129+
trackId: meeting.id,
130130
});
131131
}
132132
} else {
@@ -146,7 +146,7 @@ export class MyMeetingsComponent {
146146
duration: meeting.duration,
147147
},
148148
sortTime: startTimeMs,
149-
trackId: meeting.uid,
149+
trackId: meeting.id,
150150
});
151151
}
152152
}

apps/lfx-one/src/app/modules/meetings/components/cancel-occurrence-confirmation/cancel-occurrence-confirmation.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export class CancelOccurrenceConfirmationComponent {
3131
public onConfirm(): void {
3232
this.isCanceling.set(true);
3333

34-
this.meetingService.cancelOccurrence(this.meeting.uid, this.occurrence.occurrence_id).subscribe({
34+
this.meetingService.cancelOccurrence(this.meeting.id, this.occurrence.occurrence_id).subscribe({
3535
next: () => {
3636
this.isCanceling.set(false);
3737
this.dialogRef.close({ confirmed: true });

apps/lfx-one/src/app/modules/meetings/components/meeting-card/meeting-card.component.html

Lines changed: 22 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
data-testid="share-meeting-button"
5151
tooltip="Share Meeting"></lfx-button>
5252
}
53-
@if (meeting().project_slug && meeting().organizer && !pastMeeting() && !isLegacyMeeting()) {
53+
@if (meeting().project_slug && meeting().organizer && !pastMeeting()) {
5454
<lfx-button
5555
icon="fa-light fa-edit"
5656
[text]="true"
@@ -59,21 +59,9 @@
5959
severity="secondary"
6060
data-testid="edit-meeting-button"
6161
tooltip="Edit Meeting"
62-
[routerLink]="['/meetings', meeting().uid, 'edit']"></lfx-button>
63-
64-
<lfx-button
65-
icon="fa-light fa-people-group"
66-
[text]="true"
67-
[rounded]="true"
68-
size="small"
69-
severity="secondary"
70-
data-testid="committees-button"
71-
(click)="openCommitteeModal()"
72-
[tooltip]="
73-
meeting().committees && meeting().committees!.length > 0 ? 'Manage ' + committeeLabel.plural : 'Connect ' + committeeLabel.plural
74-
"></lfx-button>
62+
[routerLink]="['/meetings', meeting().id, 'edit']"></lfx-button>
7563
}
76-
@if (meeting().organizer && !isLegacyMeeting()) {
64+
@if (meeting().organizer) {
7765
<lfx-button
7866
icon="fa-light fa-trash"
7967
[text]="true"
@@ -134,7 +122,7 @@ <h3 class="text-base font-medium text-gray-900 leading-tight tracking-tight" dat
134122
}
135123

136124
<!-- AI Summary Review Banner for Organizers -->
137-
@if (pastMeeting() && meeting().organizer && !isLegacyMeeting() && hasSummary() && !summaryApproved()) {
125+
@if (pastMeeting() && meeting().organizer && hasSummary() && !summaryApproved()) {
138126
<div class="flex items-center gap-2.5 px-3.5 py-3 bg-blue-50 border border-blue-200 rounded-md mb-3">
139127
<i class="fa-light fa-sparkles text-base text-blue-600 flex-shrink-0 mt-0.5"></i>
140128
<div class="flex-1 flex items-center justify-between gap-3">
@@ -153,48 +141,20 @@ <h3 class="text-base font-medium text-gray-900 leading-tight tracking-tight" dat
153141

154142
<!-- Two Column Info Cards -->
155143
<div class="grid grid-cols-1 md:grid-cols-2 gap-3.5" data-testid="meeting-info-cards">
156-
<!-- Resources Card Column -->
144+
<!-- Resources Card Column (Coming Soon) -->
157145
<div class="flex flex-col">
158146
<div class="rounded-md p-3 flex flex-col gap-2 flex-1 bg-gray-100/60" data-testid="resources-card">
159147
<div class="flex items-center justify-between gap-2">
160-
<div class="flex items-center gap-2 text-xs tracking-wide leading-tight text-gray-600">
148+
<div class="flex items-center gap-2 text-xs tracking-wide leading-tight text-gray-400">
161149
<i class="fa-light fa-paperclip text-xs"></i>
162150
<span>Resources</span>
151+
<span
152+
class="inline-flex items-center gap-0.5 text-[10px] font-medium text-gray-400 bg-gray-100 border border-gray-200 px-1.5 py-0.5 rounded-full">
153+
<i class="fa-light fa-clock text-[8px]"></i>
154+
Coming Soon
155+
</span>
163156
</div>
164-
@if (!pastMeeting() && meeting().organizer && !isLegacyMeeting()) {
165-
<lfx-button
166-
icon="fa-light fa-upload text-xs"
167-
label="Add"
168-
size="small"
169-
severity="secondary"
170-
data-testid="add-resource-button"
171-
[routerLink]="['/meetings', meeting().uid, 'edit']"
172-
[queryParams]="{ step: '4' }">
173-
</lfx-button>
174-
}
175157
</div>
176-
177-
@if (totalResourcesCount() === 0) {
178-
<p class="text-[12.25px] leading-tight tracking-tight text-gray-500">None</p>
179-
} @else {
180-
<div class="grid grid-cols-2 gap-1">
181-
@for (attachment of attachments(); track attachment.uid) {
182-
<a
183-
[href]="attachment.type === 'link' ? attachment.link : '/api/meetings/' + meeting().uid + '/attachments/' + attachment.uid"
184-
target="_blank"
185-
rel="noopener noreferrer"
186-
class="inline-flex !text-black font-semibold items-center gap-1.5 px-2 py-1.5 bg-gray-200/80 hover:bg-gray-300/80 rounded text-[12px] tracking-wide transition-colors h-[26px]"
187-
[pTooltip]="attachment.type === 'link' ? attachment.name : attachment.name + ' (' + (attachment.file_size || 0 | fileSize) + ')'">
188-
@if (attachment.type === 'link') {
189-
<i class="fa-light fa-arrow-up-right-from-square w-3.5 h-3.5 flex-shrink-0"></i>
190-
} @else {
191-
<i [class]="(attachment.mime_type || '' | fileTypeIcon) + ' w-3.5 h-3.5 flex-shrink-0'"></i>
192-
}
193-
<span class="truncate">{{ attachment.name }}</span>
194-
</a>
195-
}
196-
</div>
197-
}
198158
</div>
199159

200160
<!-- Action Buttons for Resources Column -->
@@ -221,7 +181,7 @@ <h3 class="text-base font-medium text-gray-900 leading-tight tracking-tight" dat
221181
size="small"
222182
class="w-full"
223183
label="Join Meeting"
224-
[routerLink]="['/meetings', meeting().uid]"
184+
[routerLink]="['/meetings', meeting().id]"
225185
[queryParams]="joinQueryParams()"
226186
rel="noopener noreferrer"
227187
icon="fa-light fa-video"
@@ -232,7 +192,7 @@ <h3 class="text-base font-medium text-gray-900 leading-tight tracking-tight" dat
232192
}
233193
</div>
234194
}
235-
@if (pastMeeting() && meeting().organizer && !isLegacyMeeting()) {
195+
@if (pastMeeting() && meeting().organizer) {
236196
<div class="flex flex-col md:flex-row gap-2 mt-3.5">
237197
@if (hasRecording()) {
238198
<lfx-button
@@ -264,36 +224,28 @@ <h3 class="text-base font-medium text-gray-900 leading-tight tracking-tight" dat
264224

265225
<!-- People/Attendees Card Column -->
266226
<div class="flex flex-col">
267-
@if (meeting().organizer && !isLegacyMeeting()) {
227+
@if (meeting().organizer) {
268228
<!-- Organizer view with optional toggle for invited organizers -->
269229
@if (canToggleRsvpView() && showMyRsvp()) {
270230
<!-- Show RSVP Button Group when organizer toggles to set their own RSVP -->
271-
<lfx-rsvp-button-group
272-
[meeting]="meeting()"
273-
[occurrenceId]="occurrence()?.occurrence_id"
274-
[disabled]="isLegacyMeeting()"
275-
disabledMessage="RSVP functionality will soon be available for all upcoming LFX meetings visible to you">
231+
<lfx-rsvp-button-group [meeting]="meeting()" [occurrenceId]="occurrence()?.occurrence_id" [disabled]="true" disabledMessage="Coming Soon">
276232
</lfx-rsvp-button-group>
277233
} @else {
278234
<!-- Show RSVP Details for organizers (default view) -->
279235
<lfx-meeting-rsvp-details
280236
[meeting]="meeting()"
281237
[currentOccurrence]="currentOccurrence()"
282238
[pastMeeting]="pastMeeting()"
283-
[showAddButton]="!pastMeeting() && !isLegacyMeeting()"
239+
[showAddButton]="!pastMeeting()"
284240
[additionalRegistrantsCount]="additionalRegistrantsCount()"
285-
[disabled]="isLegacyMeeting()"
286-
disabledMessage="RSVP functionality will soon be available for all upcoming LFX meetings visible to you">
241+
[disabled]="true"
242+
disabledMessage="Coming Soon">
287243
</lfx-meeting-rsvp-details>
288244
}
289245
} @else if (!pastMeeting()) {
290246
<!-- Show RSVP Selection for authenticated invited non-organizers (upcoming meetings only) -->
291247
@if (isInvited()) {
292-
<lfx-rsvp-button-group
293-
[meeting]="meeting()"
294-
[occurrenceId]="occurrence()?.occurrence_id"
295-
[disabled]="isLegacyMeeting()"
296-
disabledMessage="RSVP functionality will soon be available for all upcoming LFX meetings visible to you">
248+
<lfx-rsvp-button-group [meeting]="meeting()" [occurrenceId]="occurrence()?.occurrence_id" [disabled]="true" disabledMessage="Coming Soon">
297249
</lfx-rsvp-button-group>
298250
} @else if (canRegisterForMeeting()) {
299251
<div class="h-full flex items-center justify-center">
@@ -343,7 +295,7 @@ <h3 class="text-base font-medium text-gray-900 leading-tight tracking-tight" dat
343295

344296
<!-- Action Buttons for People Column -->
345297
<div class="flex gap-2" [ngClass]="{ 'mt-3.5': !pastMeeting() || meeting().organizer }">
346-
@if (meeting().organizer && !isLegacyMeeting()) {
298+
@if (meeting().organizer) {
347299
<lfx-button
348300
class="w-full"
349301
icon="fa-light fa-users"
@@ -384,8 +336,8 @@ <h3 class="text-base font-medium text-gray-900 leading-tight tracking-tight" dat
384336
</div>
385337
</div>
386338

387-
<!-- Meeting Registrants Drawer (v2 meetings only, shown if feature enabled OR user is organizer) -->
388-
@if (!isLegacyMeeting() && (meeting().show_meeting_attendees || meeting().organizer)) {
339+
<!-- Meeting Registrants Drawer -->
340+
@if (meeting().organizer) {
389341
<p-drawer [visible]="showRegistrants()" position="right" styleClass="lg:w-1/3 w-full" (onHide)="onDrawerHide()" data-testid="meeting-registrants-drawer">
390342
<ng-template #header>
391343
<div class="flex items-center gap-3">

0 commit comments

Comments
 (0)