@myclub_se/data-access 3.7.0 → 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.
- package/esm2022/lib/api-models/api-feature-flags.mjs +1 -1
- package/esm2022/lib/models/feature-flags.mjs +9 -3
- package/esm2022/lib/services/activity.service.mjs +7 -5
- package/esm2022/lib/services/factories/feature-flags-factory.mjs +2 -2
- package/esm2022/lib/store/effects/activity.effects.mjs +43 -74
- package/fesm2022/myclub_se-data-access.mjs +57 -80
- package/fesm2022/myclub_se-data-access.mjs.map +1 -1
- package/lib/api-models/api-feature-flags.d.ts +3 -0
- package/lib/models/feature-flags.d.ts +4 -1
- package/lib/services/activity.service.d.ts +8 -2
- package/package.json +1 -1
|
@@ -2137,7 +2137,7 @@ const eventFactory = (apiEvent) => new Event(apiEvent.id, apiEvent.activity_id,
|
|
|
2137
2137
|
const externalLinkFactory = (apiExternalLink) => new ExternalLink(apiExternalLink.text, apiExternalLink.value);
|
|
2138
2138
|
|
|
2139
2139
|
const featureFlagsFactory = (apiFeatureFlags) => {
|
|
2140
|
-
return new FeatureFlags(apiFeatureFlags.extra_distribution, apiFeatureFlags.booking_system, apiFeatureFlags.core_invoices, apiFeatureFlags.member_booking, apiFeatureFlags.public_booking, apiFeatureFlags.section_handle_invoices_rfs, apiFeatureFlags.api, apiFeatureFlags.my_pages_menu, apiFeatureFlags.use_databank);
|
|
2140
|
+
return new FeatureFlags(apiFeatureFlags.extra_distribution, apiFeatureFlags.booking_system, apiFeatureFlags.core_invoices, apiFeatureFlags.member_booking, apiFeatureFlags.public_booking, apiFeatureFlags.section_handle_invoices_rfs, apiFeatureFlags.api, apiFeatureFlags.member_pdf_exports, apiFeatureFlags.member_map, apiFeatureFlags.activity_guests, apiFeatureFlags.my_pages_menu, apiFeatureFlags.use_databank);
|
|
2141
2141
|
};
|
|
2142
2142
|
|
|
2143
2143
|
const giroFactory = (apiGiro) => new Giro(apiGiro.club_id, apiGiro.section_id, apiGiro.giro_type, apiGiro.name, apiGiro.number, apiGiro.ocr);
|
|
@@ -4065,9 +4065,12 @@ class FeatureFlags {
|
|
|
4065
4065
|
public_booking;
|
|
4066
4066
|
section_handle_invoices_rfs;
|
|
4067
4067
|
api;
|
|
4068
|
+
member_pdf_exports;
|
|
4069
|
+
member_map;
|
|
4070
|
+
activity_guests;
|
|
4068
4071
|
my_pages_menu;
|
|
4069
4072
|
use_databank;
|
|
4070
|
-
constructor(extra_distribution, booking_system, core_invoices, member_booking, public_booking, section_handle_invoices_rfs, api, my_pages_menu, use_databank) {
|
|
4073
|
+
constructor(extra_distribution, booking_system, core_invoices, member_booking, public_booking, section_handle_invoices_rfs, api, member_pdf_exports, member_map, activity_guests, my_pages_menu, use_databank) {
|
|
4071
4074
|
this.extra_distribution = extra_distribution;
|
|
4072
4075
|
this.booking_system = booking_system;
|
|
4073
4076
|
this.core_invoices = core_invoices;
|
|
@@ -4075,11 +4078,14 @@ class FeatureFlags {
|
|
|
4075
4078
|
this.public_booking = public_booking;
|
|
4076
4079
|
this.section_handle_invoices_rfs = section_handle_invoices_rfs;
|
|
4077
4080
|
this.api = api;
|
|
4081
|
+
this.member_pdf_exports = member_pdf_exports;
|
|
4082
|
+
this.member_map = member_map;
|
|
4083
|
+
this.activity_guests = activity_guests;
|
|
4078
4084
|
this.my_pages_menu = my_pages_menu;
|
|
4079
4085
|
this.use_databank = use_databank;
|
|
4080
4086
|
}
|
|
4081
4087
|
static defaultValues() {
|
|
4082
|
-
return new FeatureFlags(false, false, false, false, false, false, false, false, false);
|
|
4088
|
+
return new FeatureFlags(false, false, false, false, false, false, false, false, false, false, false, false);
|
|
4083
4089
|
}
|
|
4084
4090
|
}
|
|
4085
4091
|
|
|
@@ -5726,7 +5732,7 @@ class ActivityService {
|
|
|
5726
5732
|
activityId
|
|
5727
5733
|
});
|
|
5728
5734
|
}
|
|
5729
|
-
signUpMemberOpenActivity(memberId, activityId, comment, optionalFees, responses) {
|
|
5735
|
+
signUpMemberOpenActivity(memberId, activityId, comment, optionalFees, responses, guests = []) {
|
|
5730
5736
|
return this.apiService
|
|
5731
5737
|
.updateResource(openActivityFactory, Role.MemberAdmin, MEMBER_OPEN_ACTIVITY_RESPOND_WITH_DATA_PATH, {
|
|
5732
5738
|
memberId,
|
|
@@ -5734,17 +5740,19 @@ class ActivityService {
|
|
|
5734
5740
|
}, {
|
|
5735
5741
|
comment,
|
|
5736
5742
|
optional_fees: optionalFees,
|
|
5737
|
-
responses
|
|
5743
|
+
responses,
|
|
5744
|
+
guests
|
|
5738
5745
|
});
|
|
5739
5746
|
}
|
|
5740
|
-
signUpPublicOpenActivity(activityId, comment, optionalFees, responses) {
|
|
5747
|
+
signUpPublicOpenActivity(activityId, comment, optionalFees, responses, guests = []) {
|
|
5741
5748
|
return this.apiService
|
|
5742
5749
|
.updateResource(openActivityFactory, Role.Public, PUBLIC_OPEN_ACTIVITY_RESPOND_WITH_DATA_PATH, {
|
|
5743
5750
|
activityId
|
|
5744
5751
|
}, {
|
|
5745
5752
|
comment,
|
|
5746
5753
|
optional_fees: optionalFees,
|
|
5747
|
-
responses
|
|
5754
|
+
responses,
|
|
5755
|
+
guests
|
|
5748
5756
|
});
|
|
5749
5757
|
}
|
|
5750
5758
|
updateMemberActivity(memberId, activityInviteId, activityInvite) {
|
|
@@ -8820,61 +8828,45 @@ class ActivityEffects extends ExtraMembersMixin {
|
|
|
8820
8828
|
}
|
|
8821
8829
|
}), catchError((error) => of(updateMemberActivityAttendanceFailureAction({ payload: error })))))));
|
|
8822
8830
|
updateMemberActivityInvite$ = createEffect(() => this.actions$
|
|
8823
|
-
.pipe(ofType(updateMemberActivityInviteAction), exhaustMap(({ payload }) =>
|
|
8824
|
-
|
|
8825
|
-
|
|
8826
|
-
|
|
8827
|
-
|
|
8828
|
-
|
|
8829
|
-
|
|
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
|
+
})));
|
|
8830
8844
|
updateMemberOpenActivity$ = createEffect(() => this.actions$
|
|
8831
|
-
.pipe(ofType(updateMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpMemberOpenActivity(payload.memberId, payload.activityId, payload.comment, payload.optional_fees, payload.responses)
|
|
8832
|
-
.pipe(
|
|
8833
|
-
const guests = payload.guests ?? [];
|
|
8834
|
-
if (guests.length === 0) {
|
|
8835
|
-
return of(updateMemberOpenActivitySuccessAction({ payload: openActivity }));
|
|
8836
|
-
}
|
|
8837
|
-
// Step 2: fetch activity to find member's invite ID, then add guests
|
|
8838
|
-
return this.activityService.getMemberActivity(payload.memberId, openActivity.id)
|
|
8839
|
-
.pipe(mergeMap((activity) => {
|
|
8840
|
-
const memberInvite = activity.invited_members.find(m => m.member_id === payload.memberId);
|
|
8841
|
-
if (!memberInvite) {
|
|
8842
|
-
return of(updateMemberOpenActivitySuccessAction({ payload: openActivity }));
|
|
8843
|
-
}
|
|
8844
|
-
const guestOps = guests.map(g => this.activityService.addMemberActivityGuest(payload.memberId, memberInvite.id, { name: g.name, comment: g.comment ?? undefined }));
|
|
8845
|
-
return forkJoin(guestOps).pipe(catchError(() => of(null)), map(() => updateMemberOpenActivitySuccessAction({ payload: openActivity })));
|
|
8846
|
-
}), catchError(() => of(updateMemberOpenActivitySuccessAction({ payload: openActivity }))));
|
|
8847
|
-
}), 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 })))))));
|
|
8848
8847
|
updatePublicActivityInvite$ = createEffect(() => this.actions$
|
|
8849
|
-
.pipe(ofType(updatePublicActivityInviteAction), exhaustMap(({ payload }) =>
|
|
8850
|
-
.
|
|
8851
|
-
const
|
|
8852
|
-
|
|
8853
|
-
|
|
8854
|
-
|
|
8855
|
-
|
|
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
|
+
})));
|
|
8856
8857
|
updatePublicMemberActivityInvite$ = createEffect(() => this.actions$
|
|
8857
|
-
.pipe(ofType(updatePublicMemberActivityInviteAction), exhaustMap(({ payload }) =>
|
|
8858
|
-
.
|
|
8859
|
-
const
|
|
8860
|
-
|
|
8861
|
-
|
|
8862
|
-
|
|
8863
|
-
|
|
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
|
+
})));
|
|
8864
8867
|
updatePublicMemberOpenActivity$ = createEffect(() => this.actions$
|
|
8865
|
-
.pipe(ofType(updatePublicMemberOpenActivityAction), exhaustMap(({ payload }) => this.activityService.signUpPublicOpenActivity(payload.activityId, payload.comment, payload.optional_fees, payload.responses)
|
|
8866
|
-
.pipe(
|
|
8867
|
-
const guests = payload.guests ?? [];
|
|
8868
|
-
if (guests.length === 0) {
|
|
8869
|
-
return of(updatePublicMemberOpenActivitySuccessAction({ payload: openActivity }));
|
|
8870
|
-
}
|
|
8871
|
-
return this.activityService.getPublicOpenActivityGuests(payload.activityId)
|
|
8872
|
-
.pipe(mergeMap((existingCollection) => {
|
|
8873
|
-
const existingGuests = existingCollection.toArray();
|
|
8874
|
-
return reconcilePublicOpenActivityGuests(payload.activityId, guests, existingGuests, this.activityService)
|
|
8875
|
-
.pipe(catchError(() => of(null)), map(() => updatePublicMemberOpenActivitySuccessAction({ payload: openActivity })));
|
|
8876
|
-
}), catchError(() => of(updatePublicMemberOpenActivitySuccessAction({ payload: openActivity }))));
|
|
8877
|
-
}), 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 })))))));
|
|
8878
8870
|
updateTeamActivity = createEffect(() => this.actions$
|
|
8879
8871
|
.pipe(ofType(updateTeamActivityAction), exhaustMap(({ payload }) => this.activityService.updateTeamActivity(payload.teamId, payload.activity)
|
|
8880
8872
|
.pipe(map((activity) => updateTeamActivitySuccessAction({ payload: activity })), catchError((error) => of(updateTeamActivityFailureAction({ payload: error })))))));
|
|
@@ -8893,11 +8885,17 @@ class ActivityEffects extends ExtraMembersMixin {
|
|
|
8893
8885
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: ActivityEffects, decorators: [{
|
|
8894
8886
|
type: Injectable
|
|
8895
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.
|
|
8896
8895
|
function reconcileMemberGuests(memberId, inviteId, desiredGuests, existingGuests, activityService) {
|
|
8897
8896
|
const existingById = new Map(existingGuests.map(g => [g.id, g]));
|
|
8898
8897
|
const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
|
|
8899
8898
|
const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
|
|
8900
|
-
const toAdd = desiredGuests.filter(g => !g.id);
|
|
8901
8899
|
const toUpdate = desiredGuests.filter(g => {
|
|
8902
8900
|
if (!g.id)
|
|
8903
8901
|
return false;
|
|
@@ -8906,7 +8904,6 @@ function reconcileMemberGuests(memberId, inviteId, desiredGuests, existingGuests
|
|
|
8906
8904
|
});
|
|
8907
8905
|
const ops = [
|
|
8908
8906
|
...toDelete.map(g => activityService.deleteMemberActivityGuest(memberId, inviteId, g.id)),
|
|
8909
|
-
...toAdd.map(g => activityService.addMemberActivityGuest(memberId, inviteId, { name: g.name, comment: g.comment ?? undefined })),
|
|
8910
8907
|
...toUpdate.map(g => activityService.updateMemberActivityGuest(memberId, inviteId, g.id, { name: g.name, comment: g.comment ?? undefined })),
|
|
8911
8908
|
];
|
|
8912
8909
|
return ops.length > 0 ? forkJoin(ops) : of(null);
|
|
@@ -8915,7 +8912,6 @@ function reconcilePublicTokenGuests(id, token, desiredGuests, existingGuests, ac
|
|
|
8915
8912
|
const existingById = new Map(existingGuests.map(g => [g.id, g]));
|
|
8916
8913
|
const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
|
|
8917
8914
|
const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
|
|
8918
|
-
const toAdd = desiredGuests.filter(g => !g.id);
|
|
8919
8915
|
const toUpdate = desiredGuests.filter(g => {
|
|
8920
8916
|
if (!g.id)
|
|
8921
8917
|
return false;
|
|
@@ -8924,29 +8920,10 @@ function reconcilePublicTokenGuests(id, token, desiredGuests, existingGuests, ac
|
|
|
8924
8920
|
});
|
|
8925
8921
|
const ops = [
|
|
8926
8922
|
...toDelete.map(g => activityService.deletePublicActivityGuestByToken(id, token, g.id)),
|
|
8927
|
-
...toAdd.map(g => activityService.addPublicActivityGuestByToken(id, token, { name: g.name, comment: g.comment ?? undefined })),
|
|
8928
8923
|
...toUpdate.map(g => activityService.updatePublicActivityGuestByToken(id, token, g.id, { name: g.name, comment: g.comment ?? undefined })),
|
|
8929
8924
|
];
|
|
8930
8925
|
return ops.length > 0 ? forkJoin(ops) : of(null);
|
|
8931
8926
|
}
|
|
8932
|
-
function reconcilePublicOpenActivityGuests(activityId, desiredGuests, existingGuests, activityService) {
|
|
8933
|
-
const existingById = new Map(existingGuests.map(g => [g.id, g]));
|
|
8934
|
-
const desiredIds = new Set(desiredGuests.filter(g => g.id).map(g => g.id));
|
|
8935
|
-
const toDelete = existingGuests.filter(g => !desiredIds.has(g.id));
|
|
8936
|
-
const toAdd = desiredGuests.filter(g => !g.id);
|
|
8937
|
-
const toUpdate = desiredGuests.filter(g => {
|
|
8938
|
-
if (!g.id)
|
|
8939
|
-
return false;
|
|
8940
|
-
const existing = existingById.get(g.id);
|
|
8941
|
-
return existing && (existing.name !== g.name || existing.comment !== g.comment);
|
|
8942
|
-
});
|
|
8943
|
-
const ops = [
|
|
8944
|
-
...toDelete.map(g => activityService.deletePublicOpenActivityGuest(activityId, g.id)),
|
|
8945
|
-
...toAdd.map(g => activityService.addPublicOpenActivityGuest(activityId, { name: g.name, comment: g.comment ?? undefined })),
|
|
8946
|
-
...toUpdate.map(g => activityService.updatePublicOpenActivityGuest(activityId, g.id, { name: g.name, comment: g.comment ?? undefined })),
|
|
8947
|
-
];
|
|
8948
|
-
return ops.length > 0 ? forkJoin(ops) : of(null);
|
|
8949
|
-
}
|
|
8950
8927
|
|
|
8951
8928
|
class AuthEffects {
|
|
8952
8929
|
actions$ = inject(Actions);
|