Skip to content

Commit

Permalink
Improve meeting user relation handling (#3573)
Browse files Browse the repository at this point in the history
  • Loading branch information
bastianjoel authored and peb-adr committed Apr 30, 2024
1 parent 3883f74 commit e854397
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 155 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Injectable } from '@angular/core';
import { Id } from 'src/app/domain/definitions/key-types';
import { MeetingUser } from 'src/app/domain/models/meeting-users/meeting-user';
import { toDecimal } from 'src/app/infrastructure/utils';
import { ViewMeetingUser } from 'src/app/site/pages/meetings/view-models/view-meeting-user';
Expand All @@ -17,6 +18,8 @@ export type MeetingUserPatchFn =
export class MeetingUserRepositoryService extends BaseMeetingRelatedRepository<ViewMeetingUser, MeetingUser> {
public override readonly resetOnMeetingChange = false;

private meetingUserIdMap: Map<Id, Map<Id, Id>> = new Map();

public constructor(repositoryServiceCollector: RepositoryMeetingServiceCollectorService) {
super(repositoryServiceCollector, MeetingUser);
}
Expand Down Expand Up @@ -66,4 +69,40 @@ export class MeetingUserRepositoryService extends BaseMeetingRelatedRepository<V
public getTitle = (viewUser: ViewMeetingUser) => viewUser.user?.getTitle() ?? `Unknown`;

public getVerboseName = (plural = false): string => this.translate.instant(plural ? `Participants` : `Participant`);

public getMeetingUserId(userId: Id, meetingId: Id): Id | null {
if (this.meetingUserIdMap.has(userId) && this.meetingUserIdMap.get(userId).has(meetingId)) {
return this.meetingUserIdMap.get(userId).get(meetingId);
}

return null;
}

public override deleteModels(ids: Id[]): void {
ids.forEach(id => {
const user = this.viewModelStore[id];
if (user && user.user_id && user.meeting_id) {
const meetingUserId = this.meetingUserIdMap.get(user.user_id)?.get(user.meeting_id);
if (meetingUserId === user.id) {
this.meetingUserIdMap.get(user.user_id).delete(user.meeting_id);
}
}
});
super.deleteModels(ids);
}

protected override clearViewModelStore(): void {
super.clearViewModelStore();
this.meetingUserIdMap = new Map();
}

protected override onCreateViewModel(meetingUser: ViewMeetingUser): void {
if (meetingUser.user_id && meetingUser.meeting_id) {
if (!this.meetingUserIdMap.has(meetingUser.user_id)) {
this.meetingUserIdMap.set(meetingUser.user_id, new Map());
}

this.meetingUserIdMap.get(meetingUser.user_id).set(meetingUser.meeting_id, meetingUser.id);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -338,26 +338,17 @@ export class UserRepositoryService extends BaseRepository<ViewUser, User> {
protected override createViewModel(model: User): ViewUser {
const viewModel = super.createViewModel(model);

const meetingUserIdMap = new Map<Id, Id>();
const getMeetingUserId = (meetingId: Id) => {
if (!meetingUserIdMap.has(meetingId)) {
for (const meetingUser of this.relationManager.handleRelation(
viewModel.getModel(),
this.relationsByKey[`meeting_users`]
)) {
meetingUserIdMap.set(meetingUser.meeting_id, meetingUser.id);
}
}

return meetingUserIdMap.get(meetingId);
};

viewModel.getName = () => this.getName(viewModel);
viewModel.getShortName = () => this.getShortName(viewModel);
viewModel.getFullName = (structureLevel?: ViewStructureLevel) => this.getFullName(viewModel, structureLevel);
viewModel.getMeetingUser = (meetingId: Id) => this.getMeetingUser(getMeetingUserId, meetingId);
viewModel.getLevelAndNumber = () => this.getLevelAndNumber(viewModel);
viewModel.getEnsuredActiveMeetingId = () => this.activeMeetingIdService.meetingId;
viewModel.getName = (): string => this.getName(viewModel);
viewModel.getShortName = (): string => this.getShortName(viewModel);
viewModel.getFullName = (structureLevel?: ViewStructureLevel): string =>
this.getFullName(viewModel, structureLevel);
viewModel.getMeetingUser = (meetingId: Id): ViewMeetingUser =>
this.getMeetingUser(
(meetingId: Id): Id => this.meetingUserRepo.getMeetingUserId(model.id, meetingId),
meetingId
);
viewModel.getLevelAndNumber = (): string => this.getLevelAndNumber(viewModel);
viewModel.getEnsuredActiveMeetingId = (): Id => this.activeMeetingIdService.meetingId;
return viewModel;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Id } from 'src/app/domain/definitions/key-types';
import { FULL_FIELDSET, MEETING_ROUTING_FIELDS, mergeSubscriptionFollow } from 'src/app/domain/fieldsets/misc';
import { FULL_FIELDSET, MEETING_ROUTING_FIELDS } from 'src/app/domain/fieldsets/misc';
import { MeetingUserFieldsets, UserFieldsets } from 'src/app/domain/fieldsets/user';
import { SubscriptionConfigGenerator } from 'src/app/domain/interfaces/subscription-config';
import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting';
Expand All @@ -23,21 +23,7 @@ export const agendaItemFollow: FollowList<any> = [
idField: `speaker_ids`,
fieldset: FULL_FIELDSET,
follow: [
mergeSubscriptionFollow(
{
idField: `meeting_user_id`,
follow: [
mergeSubscriptionFollow(
{ idField: `user_id`, ...UserFieldsets.FullNameSubscription },
{
idField: `user_id`,
fieldset: [`meeting_user_ids`]
}
)
]
},
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }
),
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription },
{
idField: `point_of_order_category_id`,
fieldset: FULL_FIELDSET
Expand Down Expand Up @@ -72,23 +58,7 @@ export const getAgendaListSubscriptionConfig: SubscriptionConfigGenerator = (id:
{
idField: `submitter_ids`,
fieldset: FULL_FIELDSET,
follow: [
mergeSubscriptionFollow(
{
idField: `meeting_user_id`,
follow: [
mergeSubscriptionFollow(
{ idField: `user_id`, ...UserFieldsets.FullNameSubscription },
{
idField: `user_id`,
fieldset: [`meeting_user_ids`]
}
)
]
},
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }
)
]
follow: [{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }]
}
]
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { Id } from 'src/app/domain/definitions/key-types';
import { mergeSubscriptionFollow } from 'src/app/domain/fieldsets/misc';
import { MeetingUserFieldsets, UserFieldsets } from 'src/app/domain/fieldsets/user';
import { MeetingUserFieldsets } from 'src/app/domain/fieldsets/user';
import { SubscriptionConfigGenerator } from 'src/app/domain/interfaces/subscription-config';
import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting';

Expand All @@ -23,23 +22,7 @@ export const getAssignmentSubscriptionConfig: SubscriptionConfigGenerator = (id:
},
{
idField: `assignment_candidate_ids`,
follow: [
mergeSubscriptionFollow(
{
idField: `meeting_user_id`,
follow: [
mergeSubscriptionFollow(
{ idField: `user_id`, ...UserFieldsets.FullNameSubscription },
{
idField: `user_id`,
fieldset: [`meeting_user_ids`]
}
)
]
},
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }
)
]
follow: [{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }]
}
]
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Id } from 'src/app/domain/definitions/key-types';
import { FULL_FIELDSET, MEETING_ROUTING_FIELDS, mergeSubscriptionFollow } from 'src/app/domain/fieldsets/misc';
import { MeetingUserFieldsets, UserFieldsets } from 'src/app/domain/fieldsets/user';
import { MeetingUserFieldsets } from 'src/app/domain/fieldsets/user';
import { SubscriptionConfig, SubscriptionConfigGenerator } from 'src/app/domain/interfaces/subscription-config';
import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting';

Expand Down Expand Up @@ -61,13 +61,6 @@ export const getAutopilotContentSubscriptionConfig = (id: Id): SubscriptionConfi
{
idField: `meeting_user_id`,
follow: [
mergeSubscriptionFollow(
{ idField: `user_id`, ...UserFieldsets.FullNameSubscription },
{
idField: `user_id`,
fieldset: [`meeting_user_ids`]
}
),
{
idField: `structure_level_ids`,
fieldset: [`name`, `color`]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Id } from 'src/app/domain/definitions/key-types';
import { FULL_FIELDSET, mergeSubscriptionFollow } from 'src/app/domain/fieldsets/misc';
import { MeetingUserFieldsets, UserFieldsets } from 'src/app/domain/fieldsets/user';
import { FULL_FIELDSET } from 'src/app/domain/fieldsets/misc';
import { MeetingUserFieldsets } from 'src/app/domain/fieldsets/user';
import { SubscriptionConfigGenerator } from 'src/app/domain/interfaces/subscription-config';
import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting';

Expand Down Expand Up @@ -66,65 +66,17 @@ export const getMotionListSubscriptionConfig: SubscriptionConfigGenerator = (id:
{
idField: `submitter_ids`,
fieldset: FULL_FIELDSET,
follow: [
mergeSubscriptionFollow(
{
idField: `meeting_user_id`,
follow: [
mergeSubscriptionFollow(
{ idField: `user_id`, ...UserFieldsets.FullNameSubscription },
{
idField: `user_id`,
fieldset: [`meeting_user_ids`]
}
)
]
},
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }
)
]
follow: [{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }]
},
{
idField: `editor_ids`,
fieldset: FULL_FIELDSET,
follow: [
mergeSubscriptionFollow(
{
idField: `meeting_user_id`,
follow: [
mergeSubscriptionFollow(
{ idField: `user_id`, ...UserFieldsets.FullNameSubscription },
{
idField: `user_id`,
fieldset: [`meeting_user_ids`]
}
)
]
},
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }
)
]
follow: [{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }]
},
{
idField: `working_group_speaker_ids`,
fieldset: FULL_FIELDSET,
follow: [
mergeSubscriptionFollow(
{
idField: `meeting_user_id`,
follow: [
mergeSubscriptionFollow(
{ idField: `user_id`, ...UserFieldsets.FullNameSubscription },
{
idField: `user_id`,
fieldset: [`meeting_user_ids`]
}
)
]
},
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }
)
]
follow: [{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }]
}
]
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Id } from 'src/app/domain/definitions/key-types';
import { FULL_FIELDSET, MEETING_ROUTING_FIELDS, mergeSubscriptionFollow } from 'src/app/domain/fieldsets/misc';
import { MeetingUserFieldsets, UserFieldsets } from 'src/app/domain/fieldsets/user';
import { FULL_FIELDSET, MEETING_ROUTING_FIELDS } from 'src/app/domain/fieldsets/misc';
import { MeetingUserFieldsets } from 'src/app/domain/fieldsets/user';
import { SubscriptionConfigGenerator } from 'src/app/domain/interfaces/subscription-config';
import { ViewMeeting } from 'src/app/site/pages/meetings/view-models/view-meeting';
import { DEFAULT_FIELDSET } from 'src/app/site/services/model-request-builder';
Expand Down Expand Up @@ -29,13 +29,12 @@ export const getParticipantVoteInfoSubscriptionConfig: SubscriptionConfigGenerat
`is_physical_person`,
`is_active`,
`meeting_ids`,
`meeting_user_ids`,
`is_present_in_meeting_ids`
]
},
{
idField: `vote_delegated_to_id`,
follow: [{ idField: `user_id`, fieldset: [`is_present_in_meeting_ids`, `meeting_user_ids`] }],
follow: [{ idField: `user_id`, fieldset: [`is_present_in_meeting_ids`] }],
fieldset: [`meeting_id`]
}
]
Expand Down Expand Up @@ -141,13 +140,7 @@ export const getSpeakersListSubscriptionConfig: SubscriptionConfigGenerator = (i
idField: `speaker_ids`,
fieldset: FULL_FIELDSET,
follow: [
mergeSubscriptionFollow(
{
idField: `meeting_user_id`,
follow: [{ idField: `user_id`, ...UserFieldsets.FullNameSubscription }]
},
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription }
),
{ idField: `meeting_user_id`, ...MeetingUserFieldsets.FullNameSubscription },
{
idField: `structure_level_list_of_speakers_id`,
fieldset: [],
Expand Down
33 changes: 22 additions & 11 deletions client/src/app/worker/sw-autoupdate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const subscriptionQueues: { [key: string]: AutoupdateSubscription[] } = {
required: [],
requiredMeeting: [],
sequentialnumbermapping: [],
detail: [],
other: []
};
const openTimeouts = {
Expand Down Expand Up @@ -77,7 +78,7 @@ function openConnection(
function getRequestCategory(
description: string,
_request: unknown
): 'required' | 'requiredMeeting' | 'other' | 'sequentialnumbermapping' {
): 'required' | 'requiredMeeting' | 'other' | 'sequentialnumbermapping' | null {
const required = [`theme_list:subscription`, `operator:subscription`, `organization:subscription`];
if (required.indexOf(description) !== -1) {
return `required`;
Expand All @@ -92,6 +93,12 @@ function openConnection(
return `sequentialnumbermapping`;
}

// Subscriptions ending with a number nomally are used for detail subscriptions
// and should not be bundled
if (!isNaN(+description.substring(description.length - 13, description.length - 14))) {
return null;
}

return `other`;
}

Expand Down Expand Up @@ -123,16 +130,20 @@ function openConnection(

const category = getRequestCategory(description, request);
const subscription = new AutoupdateSubscription(streamId, queryParams, requestHash, request, description, [ctx]);
subscriptionQueues[category].push(subscription);

clearTimeout(openTimeouts[category]);
openTimeouts[category] = setTimeout(() => {
const queue = subscriptionQueues[category];
subscriptionQueues[category] = [];
openTimeouts[category] = undefined;

autoupdatePool.openNewStream(queue, queryParams);
}, 5);
if (category) {
subscriptionQueues[category].push(subscription);

clearTimeout(openTimeouts[category]);
openTimeouts[category] = setTimeout(() => {
const queue = subscriptionQueues[category];
subscriptionQueues[category] = [];
openTimeouts[category] = undefined;

autoupdatePool.openNewStream(queue, queryParams);
}, 5);
} else {
autoupdatePool.openNewStream([subscription], queryParams);
}
}

function closeConnection(ctx: MessagePort, params: AutoupdateCloseStreamParams): void {
Expand Down

0 comments on commit e854397

Please sign in to comment.