@myclub_se/data-access 3.7.1 → 3.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5732,7 +5732,7 @@ class ActivityService {
5732
5732
  activityId
5733
5733
  });
5734
5734
  }
5735
- signUpMemberOpenActivity(memberId, activityId, comment, optionalFees, responses) {
5735
+ signUpMemberOpenActivity(memberId, activityId, comment, optionalFees, responses, guests = []) {
5736
5736
  return this.apiService
5737
5737
  .updateResource(openActivityFactory, Role.MemberAdmin, MEMBER_OPEN_ACTIVITY_RESPOND_WITH_DATA_PATH, {
5738
5738
  memberId,
@@ -5740,17 +5740,19 @@ class ActivityService {
5740
5740
  }, {
5741
5741
  comment,
5742
5742
  optional_fees: optionalFees,
5743
- responses
5743
+ responses,
5744
+ guests
5744
5745
  });
5745
5746
  }
5746
- signUpPublicOpenActivity(activityId, comment, optionalFees, responses) {
5747
+ signUpPublicOpenActivity(activityId, comment, optionalFees, responses, guests = []) {
5747
5748
  return this.apiService
5748
5749
  .updateResource(openActivityFactory, Role.Public, PUBLIC_OPEN_ACTIVITY_RESPOND_WITH_DATA_PATH, {
5749
5750
  activityId
5750
5751
  }, {
5751
5752
  comment,
5752
5753
  optional_fees: optionalFees,
5753
- responses
5754
+ responses,
5755
+ guests
5754
5756
  });
5755
5757
  }
5756
5758
  updateMemberActivity(memberId, activityInviteId, activityInvite) {
@@ -8826,61 +8828,45 @@ class ActivityEffects extends ExtraMembersMixin {
8826
8828
  }
8827
8829
  }), catchError((error) => of(updateMemberActivityAttendanceFailureAction({ payload: error })))))));
8828
8830
  updateMemberActivityInvite$ = createEffect(() => this.actions$
8829
- .pipe(ofType(updateMemberActivityInviteAction), exhaustMap(({ payload }) => this.activityService.updateMemberActivity(payload.memberId, payload.activityInvite.id, payload.activityInvite)
8830
- .pipe(mergeMap((activityInvite) => {
8831
- const guests = payload.guests ?? [];
8832
- const existingGuests = activityInvite.guests ?? [];
8833
- return reconcileMemberGuests(payload.memberId, activityInvite.id, guests, existingGuests, this.activityService)
8834
- .pipe(catchError(() => of(null)), mergeMap(() => this.activityService.getMemberActivityInvite(payload.memberId, activityInvite.id)), catchError(() => of(activityInvite)), map((updatedInvite) => updateMemberActivityInviteSuccessAction({ payload: updatedInvite })));
8835
- }), catchError((error) => of(updateMemberActivityInviteFailureAction({ payload: error })))))));
8831
+ .pipe(ofType(updateMemberActivityInviteAction), exhaustMap(({ payload }) => {
8832
+ // New guests are sent inline with the respond request so the backend can
8833
+ // include their guest fees in the invoice it creates on accept. Existing
8834
+ // guests are reconciled (update/delete) before responding, so removed
8835
+ // guests are not invoiced.
8836
+ const existingGuests = payload.activityInvite.guests ?? [];
8837
+ const reconcile$ = payload.guests
8838
+ ? reconcileMemberGuests(payload.memberId, payload.activityInvite.id, payload.guests, existingGuests, this.activityService)
8839
+ .pipe(catchError(() => of(null)))
8840
+ : of(null);
8841
+ return reconcile$.pipe(mergeMap(() => this.activityService.updateMemberActivity(payload.memberId, payload.activityInvite.id, { ...payload.activityInvite, guests: newGuests(payload.guests) })
8842
+ .pipe(map((activityInvite) => updateMemberActivityInviteSuccessAction({ payload: activityInvite })), catchError((error) => of(updateMemberActivityInviteFailureAction({ payload: error }))))));
8843
+ })));
8836
8844
  updateMemberOpenActivity$ = createEffect(() => this.actions$
8837
- .pipe(ofType(updateMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpMemberOpenActivity(payload.memberId, payload.activityId, payload.comment, payload.optional_fees, payload.responses)
8838
- .pipe(mergeMap((openActivity) => {
8839
- const guests = payload.guests ?? [];
8840
- if (guests.length === 0) {
8841
- return of(updateMemberOpenActivitySuccessAction({ payload: openActivity }));
8842
- }
8843
- // Step 2: fetch activity to find member's invite ID, then add guests
8844
- return this.activityService.getMemberActivity(payload.memberId, openActivity.id)
8845
- .pipe(mergeMap((activity) => {
8846
- const memberInvite = activity.invited_members.find(m => m.member_id === payload.memberId);
8847
- if (!memberInvite) {
8848
- return of(updateMemberOpenActivitySuccessAction({ payload: openActivity }));
8849
- }
8850
- const guestOps = guests.map(g => this.activityService.addMemberActivityGuest(payload.memberId, memberInvite.id, { name: g.name, comment: g.comment ?? undefined }));
8851
- return forkJoin(guestOps).pipe(catchError(() => of(null)), map(() => updateMemberOpenActivitySuccessAction({ payload: openActivity })));
8852
- }), catchError(() => of(updateMemberOpenActivitySuccessAction({ payload: openActivity }))));
8853
- }), catchError((error) => of(updateMemberOpenActivityFailureAction({ payload: error })))))));
8845
+ .pipe(ofType(updateMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpMemberOpenActivity(payload.memberId, payload.activityId, payload.comment, payload.optional_fees, payload.responses, newGuests(payload.guests))
8846
+ .pipe(map((openActivity) => updateMemberOpenActivitySuccessAction({ payload: openActivity })), catchError((error) => of(updateMemberOpenActivityFailureAction({ payload: error })))))));
8854
8847
  updatePublicActivityInvite$ = createEffect(() => this.actions$
8855
- .pipe(ofType(updatePublicActivityInviteAction), exhaustMap(({ payload }) => this.activityService.updatePublicActivityInvite(payload.activityInvite.id, payload.token, payload.activityInvite)
8856
- .pipe(mergeMap((activityInvite) => {
8857
- const guests = payload.guests ?? [];
8858
- const existingGuests = activityInvite.guests ?? [];
8859
- return reconcilePublicTokenGuests(activityInvite.id, payload.token, guests, existingGuests, this.activityService)
8860
- .pipe(catchError(() => of(null)), mergeMap(() => this.activityService.getPublicActivityInvite(activityInvite.id, payload.token)), catchError(() => of(activityInvite)), map((updatedInvite) => updatePublicActivityInviteSuccessAction({ payload: updatedInvite })));
8861
- }), catchError((error) => of(updatePublicActivityInviteFailureAction({ payload: error })))))));
8848
+ .pipe(ofType(updatePublicActivityInviteAction), exhaustMap(({ payload }) => {
8849
+ const existingGuests = payload.activityInvite.guests ?? [];
8850
+ const reconcile$ = payload.guests
8851
+ ? reconcilePublicTokenGuests(payload.activityInvite.id, payload.token, payload.guests, existingGuests, this.activityService)
8852
+ .pipe(catchError(() => of(null)))
8853
+ : of(null);
8854
+ return reconcile$.pipe(mergeMap(() => this.activityService.updatePublicActivityInvite(payload.activityInvite.id, payload.token, { ...payload.activityInvite, guests: newGuests(payload.guests) })
8855
+ .pipe(map((activityInvite) => updatePublicActivityInviteSuccessAction({ payload: activityInvite })), catchError((error) => of(updatePublicActivityInviteFailureAction({ payload: error }))))));
8856
+ })));
8862
8857
  updatePublicMemberActivityInvite$ = createEffect(() => this.actions$
8863
- .pipe(ofType(updatePublicMemberActivityInviteAction), exhaustMap(({ payload }) => this.activityService.updatePublicMemberActivityInvite(payload.activityInvite.id, payload.activityInvite)
8864
- .pipe(mergeMap((activityInvite) => {
8865
- const guests = payload.guests ?? [];
8866
- const existingGuests = activityInvite.guests ?? [];
8867
- return reconcilePublicTokenGuests(activityInvite.id, activityInvite.token, guests, existingGuests, this.activityService)
8868
- .pipe(catchError(() => of(null)), mergeMap(() => this.activityService.getPublicMemberActivityInvite(activityInvite.id)), catchError(() => of(activityInvite)), map((updatedInvite) => updatePublicMemberActivityInviteSuccessAction({ payload: updatedInvite })));
8869
- }), catchError((error) => of(updatePublicMemberActivityInviteFailureAction({ payload: error })))))));
8858
+ .pipe(ofType(updatePublicMemberActivityInviteAction), exhaustMap(({ payload }) => {
8859
+ const existingGuests = payload.activityInvite.guests ?? [];
8860
+ const reconcile$ = payload.guests
8861
+ ? reconcilePublicTokenGuests(payload.activityInvite.id, payload.activityInvite.token, payload.guests, existingGuests, this.activityService)
8862
+ .pipe(catchError(() => of(null)))
8863
+ : of(null);
8864
+ return reconcile$.pipe(mergeMap(() => this.activityService.updatePublicMemberActivityInvite(payload.activityInvite.id, { ...payload.activityInvite, guests: newGuests(payload.guests) })
8865
+ .pipe(map((activityInvite) => updatePublicMemberActivityInviteSuccessAction({ payload: activityInvite })), catchError((error) => of(updatePublicMemberActivityInviteFailureAction({ payload: error }))))));
8866
+ })));
8870
8867
  updatePublicMemberOpenActivity$ = createEffect(() => this.actions$
8871
- .pipe(ofType(updatePublicMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpPublicOpenActivity(payload.activityId, payload.comment, payload.optional_fees, payload.responses)
8872
- .pipe(mergeMap((openActivity) => {
8873
- const guests = payload.guests ?? [];
8874
- if (guests.length === 0) {
8875
- return of(updatePublicMemberOpenActivitySuccessAction({ payload: openActivity }));
8876
- }
8877
- return this.activityService.getPublicOpenActivityGuests(payload.activityId)
8878
- .pipe(mergeMap((existingCollection) => {
8879
- const existingGuests = existingCollection.toArray();
8880
- return reconcilePublicOpenActivityGuests(payload.activityId, guests, existingGuests, this.activityService)
8881
- .pipe(catchError(() => of(null)), map(() => updatePublicMemberOpenActivitySuccessAction({ payload: openActivity })));
8882
- }), catchError(() => of(updatePublicMemberOpenActivitySuccessAction({ payload: openActivity }))));
8883
- }), catchError((error) => of(updatePublicMemberOpenActivityFailureAction({ payload: error })))))));
8868
+ .pipe(ofType(updatePublicMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpPublicOpenActivity(payload.activityId, payload.comment, payload.optional_fees, payload.responses, newGuests(payload.guests))
8869
+ .pipe(map((openActivity) => updatePublicMemberOpenActivitySuccessAction({ payload: openActivity })), catchError((error) => of(updatePublicMemberOpenActivityFailureAction({ payload: error })))))));
8884
8870
  updateTeamActivity = createEffect(() => this.actions$
8885
8871
  .pipe(ofType(updateTeamActivityAction), exhaustMap(({ payload }) => this.activityService.updateTeamActivity(payload.teamId, payload.activity)
8886
8872
  .pipe(map((activity) => updateTeamActivitySuccessAction({ payload: activity })), catchError((error) => of(updateTeamActivityFailureAction({ payload: error })))))));
@@ -8899,11 +8885,17 @@ class ActivityEffects extends ExtraMembersMixin {
8899
8885
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ActivityEffects, decorators: [{
8900
8886
  type: Injectable
8901
8887
  }] });
8888
+ // New guests (no id yet) are sent inline with the respond request, so the
8889
+ // backend creates them before the invoice and includes their guest fees.
8890
+ function newGuests(guests) {
8891
+ return (guests ?? []).filter(g => !g.id).map(g => ({ name: g.name, comment: g.comment ?? undefined }));
8892
+ }
8893
+ // Updates and deletes of existing guests still use the dedicated guest
8894
+ // endpoints; new guests are sent inline with the respond request instead.
8902
8895
  function reconcileMemberGuests(memberId, inviteId, desiredGuests, existingGuests, activityService) {
8903
8896
  const existingById = new Map(existingGuests.map(g => [g.id, g]));
8904
8897
  const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
8905
8898
  const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
8906
- const toAdd = desiredGuests.filter(g => !g.id);
8907
8899
  const toUpdate = desiredGuests.filter(g => {
8908
8900
  if (!g.id)
8909
8901
  return false;
@@ -8912,7 +8904,6 @@ function reconcileMemberGuests(memberId, inviteId, desiredGuests, existingGuests
8912
8904
  });
8913
8905
  const ops = [
8914
8906
  ...toDelete.map(g => activityService.deleteMemberActivityGuest(memberId, inviteId, g.id)),
8915
- ...toAdd.map(g => activityService.addMemberActivityGuest(memberId, inviteId, { name: g.name, comment: g.comment ?? undefined })),
8916
8907
  ...toUpdate.map(g => activityService.updateMemberActivityGuest(memberId, inviteId, g.id, { name: g.name, comment: g.comment ?? undefined })),
8917
8908
  ];
8918
8909
  return ops.length > 0 ? forkJoin(ops) : of(null);
@@ -8921,7 +8912,6 @@ function reconcilePublicTokenGuests(id, token, desiredGuests, existingGuests, ac
8921
8912
  const existingById = new Map(existingGuests.map(g => [g.id, g]));
8922
8913
  const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
8923
8914
  const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
8924
- const toAdd = desiredGuests.filter(g => !g.id);
8925
8915
  const toUpdate = desiredGuests.filter(g => {
8926
8916
  if (!g.id)
8927
8917
  return false;
@@ -8930,29 +8920,10 @@ function reconcilePublicTokenGuests(id, token, desiredGuests, existingGuests, ac
8930
8920
  });
8931
8921
  const ops = [
8932
8922
  ...toDelete.map(g => activityService.deletePublicActivityGuestByToken(id, token, g.id)),
8933
- ...toAdd.map(g => activityService.addPublicActivityGuestByToken(id, token, { name: g.name, comment: g.comment ?? undefined })),
8934
8923
  ...toUpdate.map(g => activityService.updatePublicActivityGuestByToken(id, token, g.id, { name: g.name, comment: g.comment ?? undefined })),
8935
8924
  ];
8936
8925
  return ops.length > 0 ? forkJoin(ops) : of(null);
8937
8926
  }
8938
- function reconcilePublicOpenActivityGuests(activityId, desiredGuests, existingGuests, activityService) {
8939
- const existingById = new Map(existingGuests.map(g => [g.id, g]));
8940
- const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
8941
- const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
8942
- const toAdd = desiredGuests.filter(g => !g.id);
8943
- const toUpdate = desiredGuests.filter(g => {
8944
- if (!g.id)
8945
- return false;
8946
- const existing = existingById.get(g.id);
8947
- return existing && (existing.name !== g.name || existing.comment !== g.comment);
8948
- });
8949
- const ops = [
8950
- ...toDelete.map(g => activityService.deletePublicOpenActivityGuest(activityId, g.id)),
8951
- ...toAdd.map(g => activityService.addPublicOpenActivityGuest(activityId, { name: g.name, comment: g.comment ?? undefined })),
8952
- ...toUpdate.map(g => activityService.updatePublicOpenActivityGuest(activityId, g.id, { name: g.name, comment: g.comment ?? undefined })),
8953
- ];
8954
- return ops.length > 0 ? forkJoin(ops) : of(null);
8955
- }
8956
8927
 
8957
8928
  class AuthEffects {
8958
8929
  actions$ = inject(Actions);