Files
ISA-Frontend/libs/crm/data-access/src/lib/resources/customer-bonus-cards.resource.ts
Nino Righi df1fe540d0 Merged PR 2043: #5335 Endpoint Unlock wurde erweitert
#5335 Endpoint Unlock wurde erweitert
2025-11-21 14:30:01 +00:00

95 lines
2.9 KiB
TypeScript

import { Injectable, inject, resource, signal, computed } from '@angular/core';
import { logger } from '@isa/core/logging';
import { CrmSearchService } from '../services/crm-search.service';
import { BonusCardInfo } from '../models';
/**
* Resource for loading customer bonus cards (Kundenkarten).
*
* Provides reactive loading of all bonus cards for a given customer ID.
* Customer ID can be changed dynamically via `params()` method.
*
* **Note:** This resource should be provided at the component level,
* not in root. Provide it in the `providers` array of the component
* that needs scoped access to customer bonus cards.
*
* @example
* ```typescript
* @Component({
* providers: [CustomerBonusCardsResource],
* })
* export class MyFeatureComponent {
* #bonusCardsResource = inject(CustomerBonusCardsResource);
*
* cards = this.#bonusCardsResource.resource.value;
* isLoading = this.#bonusCardsResource.resource.isLoading;
*
* loadCards(customerId: number) {
* this.#bonusCardsResource.params({ customerId });
* }
* }
* ```
*/
@Injectable()
export class CustomerBonusCardsResource {
readonly #crmSearchService = inject(CrmSearchService);
readonly #logger = logger(() => ({ context: 'CustomerBonusCardsResource' }));
readonly #customerId = signal<number | undefined>(undefined);
/**
* Current customer ID being loaded.
*/
readonly customerId = computed(() => this.#customerId());
/**
* Resource that loads bonus cards based on current parameters.
*
* Exposes:
* - `value()` - Array of bonus cards or undefined
* - `isLoading()` - Loading state
* - `error()` - Error state
* - `status()` - Current status ('idle' | 'loading' | 'resolved' | 'error')
*/
readonly resource = resource({
params: computed(() => ({ customerId: this.#customerId() })),
loader: async ({
params,
abortSignal,
}): Promise<BonusCardInfo[] | undefined> => {
const { customerId } = params;
if (!customerId) {
this.#logger.debug('No customerId provided, skipping load');
return undefined;
}
this.#logger.debug('Loading bonus cards', () => ({ customerId }));
const response = await this.#crmSearchService.fetchCustomerCards(
{ customerId },
abortSignal,
);
this.#logger.debug('Bonus cards loaded', () => ({
customerId,
count: response?.result?.length ?? 0,
}));
return response?.result;
},
defaultValue: undefined,
});
/**
* Update resource parameters to trigger a reload.
*
* @param params - Parameters for loading bonus cards
* @param params.customerId - Customer ID to load cards for (undefined clears data)
*/
params(params: { customerId?: number }): void {
this.#logger.debug('Updating params', () => params);
this.#customerId.set(params.customerId);
}
}