@acontplus/ng-infrastructure 3.0.0 → 3.1.0
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acontplus-ng-infrastructure.mjs","sources":["../../../../packages/ng-infrastructure/src/lib/interceptors/api-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/services/logging-service.ts","../../../../packages/ng-infrastructure/src/lib/services/tenant-info.ts","../../../../packages/ng-infrastructure/src/lib/services/correlation-info.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/http-context-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/spinner-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/repositories/base-http-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/generic-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/repository-factory.ts","../../../../packages/ng-infrastructure/src/lib/adapters/angular-http-adapter.ts","../../../../packages/ng-infrastructure/src/lib/services/core-config-service.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/base-use-case.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/commands.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/queries.ts","../../../../packages/ng-infrastructure/src/acontplus-ng-infrastructure.ts"],"sourcesContent":["import {\n HttpInterceptorFn,\n HttpEvent,\n HttpResponse,\n HttpErrorResponse,\n HttpRequest,\n HttpContextToken,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { catchError, switchMap, of, throwError, Observable } from 'rxjs';\nimport { ApiResponse } from '@acontplus/core';\nimport { NotificationService } from '@acontplus/ng-notifications';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\n\n//const RETRY_COUNT = 2;\n\n// ---------------------------------------------------------------------------\n// HTTP Context Tokens\n// ---------------------------------------------------------------------------\n\n/**\n * Skip all toast notifications for a specific request.\n * Usage: new HttpContext().set(SKIP_NOTIFICATION, true)\n */\nexport const SKIP_NOTIFICATION = new HttpContextToken<boolean>(() => false);\n\n/**\n * Force-show or force-hide notifications, overriding URL/method exclusion logic.\n * Usage: new HttpContext().set(SHOW_NOTIFICATIONS, true)\n */\nexport const SHOW_NOTIFICATIONS = new HttpContextToken<boolean | undefined>(() => undefined);\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nexport const apiInterceptor: HttpInterceptorFn = (req, next) => {\n const toastr = inject(NotificationService);\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n\n // Attach Bearer token when available\n const token = tokenProvider?.getToken();\n const modifiedReq = token ? req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }) : req;\n\n return next(modifiedReq).pipe(\n // Retry only on network errors or 5xx — never on 4xx client errors.\n // Shows toast + updates spinner message so the user knows what is happening.\n // retry({\n // count: RETRY_COUNT,\n // delay: (error: HttpErrorResponse, attempt) => {\n // const isRetryable = error.status === 0 || (error.status >= 500 && error.status < 600);\n // if (!isRetryable) throw error; // 4xx — bubble up immediately, no retry\n\n // // Toast informa al usuario\n // toastr.warning({\n // message: `Reintentando solicitud (${attempt} de ${RETRY_COUNT})...`,\n // title: 'Conexión inestable',\n // config: { duration: 2500 },\n // });\n\n // return timer(1000 * attempt);\n // },\n // }),\n\n // Handle successful responses via switchMap so we can return an Observable\n // (needed to properly throw ApiResponse errors into the RxJS stream).\n switchMap((event: HttpEvent<unknown>) => {\n if (event instanceof HttpResponse) {\n const standardized = standardizeApiResponse(event.body);\n handleToastNotifications(standardized, toastr, req);\n\n if (standardized.status === 'error') {\n handleApiResponseError(standardized, toastr, req);\n return throwError(() => standardized);\n }\n\n return of(transformResponseForConsumers(standardized, event));\n }\n return of(event);\n }),\n\n // Handle HTTP-level errors — show notification for critical errors, always re-throw.\n catchError((error: HttpErrorResponse) => {\n return handleHttpError(error, toastr);\n }),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Standardisation\n// ---------------------------------------------------------------------------\n\nfunction standardizeApiResponse(body: unknown): ApiResponse<unknown> {\n if (isValidApiResponse(body)) return body;\n\n // Wrap any non-null/undefined body (including objects with non-standard status fields)\n if (body !== null && body !== undefined) {\n return wrapSuccess(body);\n }\n\n return wrapSuccess(undefined);\n}\n\nfunction wrapSuccess(data: unknown): ApiResponse<unknown> {\n return {\n status: 'success',\n code: '200',\n message: 'Operation completed successfully',\n data,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction isValidApiResponse(response: unknown): response is ApiResponse<unknown> {\n if (response === null || typeof response !== 'object') return false;\n const r = response as Record<string, unknown>;\n return (\n 'status' in r &&\n 'code' in r &&\n typeof r['status'] === 'string' &&\n ['success', 'error', 'warning'].includes(r['status'] as string)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Notifications\n// ---------------------------------------------------------------------------\n\nfunction handleToastNotifications(\n response: ApiResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n): void {\n // SKIP_NOTIFICATION always wins — even over SHOW_NOTIFICATIONS\n if (req.context.get(SKIP_NOTIFICATION)) return;\n\n const forceShow = req.context.get(SHOW_NOTIFICATIONS);\n const autoShow = shouldShowSuccessToast(req);\n const showNotifications = forceShow !== undefined ? forceShow : autoShow;\n\n if (!showNotifications) return;\n if (!response.message) return;\n if (!(['success', 'warning', 'error'] as string[]).includes(response.status)) return;\n\n // Primary notification — show main message once\n notificationService.show({\n type: response.status as 'success' | 'warning' | 'error',\n message: response.message,\n });\n\n // Secondary: show individual warnings only when no primary message covered them\n if (response.status === 'warning' && response.warnings?.length && response.message) {\n response.warnings.forEach((w) =>\n notificationService.show({ type: 'warning', message: w.message }),\n );\n }\n\n // Secondary: show individual errors only when no primary message covered them\n if (response.status === 'error' && response.errors?.length && response.message) {\n response.errors.forEach((e) => notificationService.show({ type: 'error', message: e.message }));\n }\n}\n\nfunction handleApiResponseError(\n response: ApiResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n): void {\n if (req.context.get(SKIP_NOTIFICATION)) return;\n\n const message =\n response.message || response.errors?.[0]?.message || 'An unexpected error occurred';\n\n notificationService.error({ message, config: { duration: 5000 } });\n}\n\n// ---------------------------------------------------------------------------\n// Response transformation\n// ---------------------------------------------------------------------------\n\nfunction transformResponseForConsumers(\n response: ApiResponse<unknown>,\n originalEvent: HttpResponse<unknown>,\n): HttpResponse<unknown> {\n switch (response.status) {\n case 'success':\n case 'warning':\n // Unwrap data for consumers; fall back to full envelope when no data\n return response.data !== undefined && response.data !== null\n ? originalEvent.clone({ body: response.data })\n : originalEvent.clone({ body: response });\n\n case 'error':\n default:\n return originalEvent.clone({ body: response });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Error handling\n// ---------------------------------------------------------------------------\n\nfunction handleHttpError(\n error: HttpErrorResponse,\n notificationService: NotificationService,\n): Observable<never> {\n if (shouldShowCriticalErrorNotification(error.status)) {\n notificationService.error({\n message: getCriticalErrorMessage(error),\n title: getErrorTitle(error.status),\n config: { duration: 5000 },\n });\n }\n return throwError(() => error);\n}\n\nfunction shouldShowCriticalErrorNotification(status: number): boolean {\n return status === 0 || (status >= 500 && status < 600);\n}\n\nfunction getErrorTitle(status: number): string {\n if (status === 0) return 'Connection Error';\n if (status >= 500) return 'Server Error';\n return 'Error';\n}\n\nfunction getCriticalErrorMessage(error: HttpErrorResponse): string {\n if (error.status === 0) {\n return 'Unable to connect to the server. Please check your network connection.';\n }\n if (error.status >= 500) {\n return (\n error.error?.message ?? error.message ?? 'A server error occurred. Please try again later.'\n );\n }\n return error.error?.message ?? error.message ?? 'An unexpected error occurred';\n}\n\n// ---------------------------------------------------------------------------\n// Utility: decide whether to auto-show toast\n// ---------------------------------------------------------------------------\n\nconst MUTABLE_METHODS = new Set(['post', 'put', 'patch', 'delete']);\n\nconst EXCLUDED_URL_PATTERNS = [\n '/list',\n '/search',\n '/query',\n '/page',\n '/paginated',\n '/health',\n '/status',\n '/ping',\n];\n\nfunction shouldShowSuccessToast(req: HttpRequest<unknown>): boolean {\n const method = req.method.toLowerCase();\n const url = req.url.toLowerCase();\n\n if (!MUTABLE_METHODS.has(method)) return false;\n if (EXCLUDED_URL_PATTERNS.some((p) => url.includes(p))) return false;\n\n return true;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\nimport { HttpRequestLog, HttpErrorLog } from '../interceptors';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LoggingService {\n private readonly environment = inject(ENVIRONMENT);\n\n log(level: 'info' | 'warn' | 'error', message: string, context?: unknown): void {\n if (this.environment.isProduction) {\n // Production logging (e.g., to external service)\n this.logToExternalService(level, message, context);\n return;\n }\n console[level](`[${level.toUpperCase()}] ${message}`, context);\n }\n\n info(message: string, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: string, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: string, context?: unknown): void {\n this.log('error', message, context);\n }\n\n // HTTP Request Logging\n logHttpRequest(log: HttpRequestLog): void {\n this.info(`HTTP Request - ${log.method} ${log.url}`, {\n requestId: log.requestId,\n correlationId: log.correlationId,\n tenantId: log.tenantId,\n headers: log.headers,\n isCustomUrl: log.isCustomUrl,\n timestamp: log.timestamp,\n });\n }\n\n // HTTP Error Logging\n logHttpError(error: HttpErrorLog): void {\n this.error(`HTTP Error - ${error.method} ${error.url}`, {\n status: error.status,\n statusText: error.statusText,\n requestId: error.requestId,\n correlationId: error.correlationId,\n tenantId: error.tenantId,\n errorDetails: error.errorDetails,\n environment: error.environment,\n timestamp: error.timestamp,\n });\n }\n\n // Network Error Logging\n logNetworkError(correlationId: string): void {\n this.error('Network connection failed', {\n type: 'network-error',\n correlationId,\n userAgent: navigator.userAgent,\n online: navigator.onLine,\n });\n }\n\n // Rate Limit Error Logging\n logRateLimitError(correlationId: string, url: string): void {\n this.warn('Rate limit exceeded', {\n type: 'rate-limit-error',\n correlationId,\n url,\n });\n }\n\n private logToExternalService(_level: string, _message: string, _context?: unknown): void {\n // Implement external logging service integration\n // e.g., Sentry, LogRocket, etc.\n // This is a placeholder for production logging implementation\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { LoggingService } from './logging-service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TenantInfo {\n private tenantId: string | null = null;\n private readonly logger = inject(LoggingService);\n\n getTenantId(): string {\n if (!this.tenantId) {\n // Get from localStorage, sessionStorage, or JWT token\n this.tenantId =\n localStorage.getItem('tenantId') ||\n sessionStorage.getItem('tenantId') ||\n this.extractTenantFromToken() ||\n 'default-tenant';\n }\n return this.tenantId;\n }\n\n getCurrentTenant(): string | null {\n return this.tenantId;\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n localStorage.setItem('tenantId', tenantId);\n }\n\n handleForbidden(): void {\n this.logger.error('Access forbidden for tenant:', this.tenantId);\n // Redirect to tenant selection or show error message\n // this.router.navigate(['/tenant-access-denied']);\n }\n\n private extractTenantFromToken(): string | null {\n // Implementation depends on your JWT token structure\n // This is a placeholder\n return null;\n }\n\n clearTenant(): void {\n this.tenantId = null;\n localStorage.removeItem('tenantId');\n sessionStorage.removeItem('tenantId');\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CorrelationInfo {\n private readonly correlationId = signal<string | null>(null);\n private readonly CORRELATION_KEY = 'correlation-id';\n\n // Signal-based getter for reactive updates\n readonly currentCorrelationId = computed(() => this.correlationId());\n\n getOrCreateCorrelationId(): string {\n if (!this.correlationId()) {\n // Try to get from sessionStorage first (for page refreshes)\n const id = sessionStorage.getItem(this.CORRELATION_KEY) || uuidv4();\n this.correlationId.set(id);\n sessionStorage.setItem(this.CORRELATION_KEY, id);\n }\n return this.correlationId()!;\n }\n\n setCorrelationId(correlationId: string): void {\n this.correlationId.set(correlationId);\n sessionStorage.setItem(this.CORRELATION_KEY, correlationId);\n }\n\n resetCorrelationId(): void {\n this.correlationId.set(null);\n sessionStorage.removeItem(this.CORRELATION_KEY);\n }\n\n getId(): string {\n return this.getOrCreateCorrelationId();\n }\n}\n","import { inject, InjectionToken } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n HttpContextToken,\n HttpContext,\n HttpInterceptorFn,\n HttpErrorResponse,\n HttpRequest,\n} from '@angular/common/http';\nimport { catchError, throwError, switchMap, Observable } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\nimport { AUTH_TOKEN, ENVIRONMENT } from '@acontplus/ng-config';\nimport { TenantInfo } from '../services/tenant-info';\nimport { CorrelationInfo } from '../services/correlation-info';\nimport { LoggingService } from '../services/logging-service';\n\n// ---------------------------------------------------------------------------\n// HTTP Context Tokens & helpers\n// ---------------------------------------------------------------------------\n\n/** Mark a request as using an absolute URL (skip base-URL injection). */\nconst CUSTOM_URL = new HttpContextToken<boolean>(() => false);\n\n/** Skip all context headers (correlation, tenant, etc.) for this request. */\nconst SKIP_CONTEXT_HEADERS = new HttpContextToken<boolean>(() => false);\n\n/** Merge additional headers into the request at call-site. */\nconst CUSTOM_HEADERS = new HttpContextToken<Record<string, string>>(() => ({}));\n\nexport function customUrl(): HttpContext {\n return new HttpContext().set(CUSTOM_URL, true);\n}\n\nexport function skipContextHeaders(): HttpContext {\n return new HttpContext().set(SKIP_CONTEXT_HEADERS, true);\n}\n\nexport function withCustomHeaders(headers: Record<string, string>): HttpContext {\n return new HttpContext().set(CUSTOM_HEADERS, headers);\n}\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface HttpContextConfig {\n enableCorrelationTracking?: boolean;\n enableRequestLogging?: boolean;\n enableErrorLogging?: boolean;\n customHeaders?: Record<string, string | (() => string)>;\n clientVersion?: string;\n tenantIdHeader?: string;\n correlationIdHeader?: string;\n requestIdHeader?: string;\n timestampHeader?: string;\n /** URL substrings or regex patterns to exclude from header injection. */\n excludeUrls?: string[];\n /** URL substrings that should NOT receive an Authorization header. */\n skipAuthUrls?: string[];\n includeAuthToken?: boolean;\n baseUrlInjection?: boolean;\n /** Called when a 401 is received and a refresh token is available. */\n refreshTokenCallback?: () => Observable<{ token: string; refreshToken?: string }>;\n /** Called after a failed token refresh — should clear auth state. */\n logoutCallback?: () => void;\n}\n\nconst DEFAULT_CONFIG: Required<HttpContextConfig> = {\n enableCorrelationTracking: true,\n enableRequestLogging: false,\n enableErrorLogging: true,\n customHeaders: {},\n clientVersion: '1.0.0',\n tenantIdHeader: 'Tenant-Id',\n correlationIdHeader: 'Correlation-Id',\n requestIdHeader: 'Request-Id',\n timestampHeader: 'Timestamp',\n excludeUrls: [],\n skipAuthUrls: ['/login', '/register', '/refresh'],\n includeAuthToken: true,\n baseUrlInjection: true,\n refreshTokenCallback: undefined as any,\n logoutCallback: undefined as any,\n};\n\nexport const HTTP_CONTEXT_CONFIG = new InjectionToken<HttpContextConfig>('HTTP_CONTEXT_CONFIG', {\n factory: () => DEFAULT_CONFIG,\n});\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nexport const httpContextInterceptor: HttpInterceptorFn = (req, next) => {\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n const router = inject(Router);\n const tenantService = inject(TenantInfo);\n const correlationService = inject(CorrelationInfo);\n const loggingService = inject(LoggingService);\n const environment = inject(ENVIRONMENT);\n\n const config: Required<HttpContextConfig> = {\n ...DEFAULT_CONFIG,\n enableRequestLogging: !environment.isProduction,\n ...inject(HTTP_CONTEXT_CONFIG, { optional: true }),\n };\n\n // ── Context token flags ──────────────────────────────────────────────────\n const isCustomUrl = req.context.get(CUSTOM_URL);\n const skipHeaders = req.context.get(SKIP_CONTEXT_HEADERS);\n const contextHeaders = req.context.get(CUSTOM_HEADERS);\n\n if (skipHeaders) return next(req);\n\n // ── URL exclusion (with ReDoS protection) ────────────────────────────────\n if (shouldExcludeUrl(req.url, config.excludeUrls)) return next(req);\n\n // ── Auth skip check ──────────────────────────────────────────────────────\n const skipAuth = shouldSkipAuth(req.url, config.skipAuthUrls);\n\n // ── URL resolution ───────────────────────────────────────────────────────\n const finalUrl = resolveFinalUrl(\n req.url,\n isCustomUrl,\n config.baseUrlInjection,\n environment.apiBaseUrl,\n );\n\n // ── Header construction ──────────────────────────────────────────────────\n const headers = buildHeaders(\n config,\n tokenProvider,\n correlationService,\n tenantService,\n environment,\n skipAuth,\n contextHeaders,\n req,\n );\n\n // ── Clone request ────────────────────────────────────────────────────────\n const enhancedReq = req.clone({ url: finalUrl, setHeaders: headers });\n\n // ── Request logging ──────────────────────────────────────────────────────\n if (config.enableRequestLogging) {\n logRequest(loggingService, req, finalUrl, headers, {\n requestId: headers[config.requestIdHeader],\n correlationId: headers[config.correlationIdHeader],\n tenantId: headers[config.tenantIdHeader],\n isCustomUrl,\n });\n }\n\n // ── Execute request with unified error handling ──────────────────────────\n const hasAuth = !!headers['Authorization'];\n\n // Shared error context for both handlers below\n const errorCtx = {\n req,\n finalUrl,\n requestId: headers[config.requestIdHeader],\n correlationId: headers[config.correlationIdHeader],\n tenantId: headers[config.tenantIdHeader],\n isCustomUrl,\n hasAuth,\n config,\n router,\n loggingService,\n tenantService,\n tokenProvider,\n environment,\n };\n\n // Base pipeline — always present\n const base$ = next(enhancedReq).pipe(\n catchError((error: HttpErrorResponse) => handleContextError(error, errorCtx)),\n );\n\n // When auth + refresh callback are available, prepend a 401-refresh layer\n if (!hasAuth || !config.refreshTokenCallback) {\n return base$;\n }\n\n return next(enhancedReq).pipe(\n // Intercept 401 first — attempt token refresh before general error handling\n catchError((error: HttpErrorResponse) => {\n if (error.status !== 401) return throwError(() => error);\n\n const refreshToken = tokenProvider?.getRefreshToken?.();\n if (!refreshToken?.trim()) return throwError(() => error);\n\n return config.refreshTokenCallback!().pipe(\n switchMap(({ token }) =>\n next(\n req.clone({\n url: finalUrl,\n setHeaders: { ...headers, Authorization: `Bearer ${token}` },\n }),\n ),\n ),\n catchError((refreshError) => {\n config.logoutCallback?.();\n return throwError(() => refreshError);\n }),\n );\n }),\n // General error handling (logs, redirects, tenant, rate-limit, etc.)\n catchError((error: HttpErrorResponse) => handleContextError(error, errorCtx)),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Helper functions to reduce cognitive complexity\n// ---------------------------------------------------------------------------\n\nfunction shouldExcludeUrl(url: string, excludeUrls: string[]): boolean {\n return excludeUrls.some((pattern) => {\n try {\n return url.includes(pattern) || new RegExp(pattern).test(url);\n } catch {\n return false; // malformed regex — skip safely\n }\n });\n}\n\nfunction shouldSkipAuth(url: string, skipAuthUrls: string[]): boolean {\n return skipAuthUrls.some((u) => url.includes(u));\n}\n\nfunction resolveFinalUrl(\n url: string,\n isCustomUrl: boolean,\n baseUrlInjection: boolean,\n apiBaseUrl: string,\n): string {\n return isCustomUrl || !baseUrlInjection ? url : `${apiBaseUrl}${url}`;\n}\n\nfunction buildHeaders(\n config: Required<HttpContextConfig>,\n tokenProvider: any,\n correlationService: CorrelationInfo,\n tenantService: TenantInfo,\n environment: any,\n skipAuth: boolean,\n contextHeaders: Record<string, string>,\n req: HttpRequest<unknown>,\n): Record<string, string> {\n const correlationId = config.enableCorrelationTracking\n ? correlationService.getOrCreateCorrelationId()\n : uuidv4();\n const tenantId = tenantService.getTenantId();\n const requestId = uuidv4();\n\n const headers: Record<string, string> = {\n [config.requestIdHeader]: requestId,\n [config.timestampHeader]: new Date().toISOString(),\n };\n\n if (config.enableCorrelationTracking) {\n headers[config.correlationIdHeader] = correlationId;\n }\n\n if (tenantId) {\n headers[config.tenantIdHeader] = tenantId;\n }\n\n if (config.clientVersion) {\n headers['Client-Version'] = config.clientVersion;\n }\n\n if (environment.clientId) {\n headers['Client-Id'] = environment.clientId;\n }\n\n if (config.includeAuthToken && !skipAuth) {\n const authToken = tokenProvider?.getToken();\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n // Static and dynamic custom headers from config\n Object.entries(config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n // Per-request headers from HttpContext\n Object.entries(contextHeaders).forEach(([key, value]) => {\n headers[key] = value;\n });\n\n // Content-Type for mutation requests (do not override if already set).\n // Only set application/json when the body is JSON-serializable.\n // Binary types (FormData, Blob, ArrayBuffer, etc.) need the browser to set Content-Type.\n if (\n ['POST', 'PUT', 'PATCH'].includes(req.method) &&\n !req.headers.has('Content-Type') &&\n isJsonBody(req.body)\n ) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n}\n\nfunction logRequest(\n loggingService: LoggingService,\n req: HttpRequest<unknown>,\n finalUrl: string,\n headers: Record<string, string>,\n logData: { requestId: string; correlationId: string; tenantId: string; isCustomUrl: boolean },\n): void {\n loggingService.logHttpRequest({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId: logData.requestId,\n correlationId: logData.correlationId,\n tenantId: logData.tenantId,\n timestamp: new Date().toISOString(),\n headers: Object.keys(headers),\n isCustomUrl: logData.isCustomUrl,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Unified error handler (eliminates duplicated catchError blocks)\n// ---------------------------------------------------------------------------\n\ninterface ErrorContext {\n req: HttpRequest<unknown>;\n finalUrl: string;\n requestId: string;\n correlationId: string;\n tenantId: string;\n isCustomUrl: boolean;\n hasAuth: boolean;\n config: Required<HttpContextConfig>;\n router: Router;\n loggingService: LoggingService;\n tenantService: TenantInfo;\n tokenProvider: any;\n environment: any;\n}\n\nfunction handleContextError(error: HttpErrorResponse, ctx: ErrorContext) {\n const {\n req,\n finalUrl,\n requestId,\n correlationId,\n tenantId,\n isCustomUrl,\n config,\n router,\n loggingService,\n tenantService,\n environment,\n } = ctx;\n\n if (config.enableErrorLogging) {\n loggingService.logHttpError({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId,\n correlationId,\n tenantId,\n status: error.status,\n statusText: error.statusText,\n message: error.message,\n timestamp: new Date().toISOString(),\n errorDetails: error.error,\n environment: environment.clientId,\n isCustomUrl,\n headers: [],\n });\n }\n\n switch (error.status) {\n case 401:\n loggingService.error('Unauthorized — redirecting to login');\n // Let auth service clear tokens before navigation\n config.logoutCallback?.();\n router.navigate([`/${environment.loginRoute}`]);\n break;\n case 403:\n tenantService.handleForbidden();\n break;\n case 0:\n loggingService.logNetworkError(correlationId);\n break;\n case 429:\n loggingService.logRateLimitError(correlationId, finalUrl);\n break;\n }\n\n return throwError(() => error);\n}\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nfunction isJsonBody(body: unknown): boolean {\n if (body === null || body === undefined) return true;\n if (typeof body === 'string' || typeof body === 'number' || typeof body === 'boolean')\n return true;\n if (Array.isArray(body)) return true;\n if (\n typeof body === 'object' &&\n !(body instanceof FormData) &&\n !(body instanceof Blob) &&\n !(body instanceof ArrayBuffer) &&\n !(body instanceof URLSearchParams)\n )\n return true;\n return false;\n}\n\nexport interface HttpRequestLog {\n method: string;\n url: string;\n originalUrl: string;\n requestId: string;\n correlationId: string;\n tenantId: string;\n timestamp: string;\n headers: string[];\n isCustomUrl: boolean;\n}\n\nexport interface HttpErrorLog extends HttpRequestLog {\n status: number;\n statusText: string;\n message: string;\n errorDetails: unknown;\n environment: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public helpers for library consumers\n// ---------------------------------------------------------------------------\n\nexport function createHttpContextConfig(\n overrides: Partial<HttpContextConfig> = {},\n): HttpContextConfig {\n return { ...DEFAULT_CONFIG, ...overrides };\n}\n\n/**\n * Register the interceptor configuration in your app providers.\n *\n * @example\n * // app.config.ts\n * provideHttpClient(\n * withInterceptors([\n * httpContextInterceptor, // 1st — adds headers, handles 401 refresh\n * apiInterceptor, // 2nd — normalises response, shows toasts\n * ])\n * ),\n * ...provideHttpContext({ clientVersion: '2.0.0' }),\n */\nexport function provideHttpContext(config: Partial<HttpContextConfig> = {}) {\n return [\n {\n provide: HTTP_CONTEXT_CONFIG,\n useValue: createHttpContextConfig(config),\n },\n ];\n}\n","import {\n HttpContext,\n HttpContextToken,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { finalize } from 'rxjs/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { OverlayService } from '@acontplus/ng-components';\n\nexport const SHOW_SPINNER = new HttpContextToken<boolean>(() => true);\n\nexport function withoutSpinner(): HttpContext {\n return new HttpContext().set(SHOW_SPINNER, false);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActiveRequestsTracker {\n private readonly requests: HttpRequest<unknown>[] = [];\n\n get count(): number {\n return this.requests.length;\n }\n\n /** Retorna true si se pasa de 0 → 1 (primera request activa). */\n add(request: HttpRequest<unknown>): boolean {\n this.requests.push(request);\n return this.requests.length === 1;\n }\n\n /** Retorna true si se pasa de 1 → 0 (última request completada). */\n remove(request: HttpRequest<unknown>): boolean {\n const index = this.requests.indexOf(request);\n if (index >= 0) {\n this.requests.splice(index, 1);\n }\n return this.requests.length === 0;\n }\n}\n\nexport const spinnerInterceptor: HttpInterceptorFn = (req, next) => {\n const activeRequests = inject(ActiveRequestsTracker);\n const overlayService = inject(OverlayService);\n\n if (!req.context.get(SHOW_SPINNER)) {\n return next(req);\n }\n\n // showSpinner solo cuando pasamos de 0 → 1 requests\n const isFirst = activeRequests.add(req);\n if (isFirst) {\n overlayService.showSpinner();\n }\n\n return next(req).pipe(\n finalize(() => {\n // hideSpinner solo cuando pasamos de 1 → 0 requests\n const isEmpty = activeRequests.remove(req);\n if (isEmpty) {\n overlayService.hideSpinner();\n }\n }),\n );\n};\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { RepositoryConfig } from '@acontplus/core';\n\n@Injectable()\nexport abstract class BaseHttpRepository {\n protected http = inject(HttpClient);\n protected abstract config: RepositoryConfig; // Abstract property\n\n protected buildUrl(path = ''): string {\n const baseUrl = (this.config.baseUrl || '/api').replaceAll(/\\/+/g, '');\n const version = this.config.version ? `/v${this.config.version}` : '';\n const endpoint = path\n ? `${this.config.endpoint}/${path}`.replaceAll(/\\/+/g, '/')\n : this.config.endpoint;\n\n return `${baseUrl}${version}/${endpoint.replace(/^\\/+/, '')}`;\n }\n\n protected get<T>(params?: Record<string, string | number | boolean>, path = ''): Observable<T> {\n return this.http.get<T>(this.buildUrl(path), { params });\n }\n\n protected post<T>(body: unknown, path = ''): Observable<T> {\n return this.http.post<T>(this.buildUrl(path), body);\n }\n\n protected put<T>(body: unknown, path = ''): Observable<T> {\n return this.http.put<T>(this.buildUrl(path), body);\n }\n\n protected patch<T>(body?: unknown, path = ''): Observable<T> {\n return this.http.patch<T>(this.buildUrl(path), body);\n }\n\n protected delete<T>(path = ''): Observable<T> {\n return this.http.delete<T>(this.buildUrl(path));\n }\n}\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BaseHttpRepository } from './base-http-repository';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository, SearchableRepository } from '@acontplus/ng-config';\n\n// Create an injection token for RepositoryConfig\nexport const REPOSITORY_CONFIG = new InjectionToken<RepositoryConfig>('REPOSITORY_CONFIG');\n\n@Injectable()\nexport class GenericRepository<TEntity = any, TId extends string | number = number>\n extends BaseHttpRepository\n implements BaseRepository<TEntity, TId>\n{\n protected override config: RepositoryConfig;\n\n constructor() {\n const config = inject<RepositoryConfig>(REPOSITORY_CONFIG);\n super();\n this.config = config;\n }\n\n getById(id: TId): Observable<TEntity> {\n return this.get<TEntity>(undefined, id.toString());\n }\n\n getAll(pagination?: PaginationParams): Observable<PagedResult<TEntity>> {\n const params = this.buildParams(pagination);\n return this.get<PagedResult<TEntity>>(params);\n }\n\n create(entity: Partial<TEntity>): Observable<TEntity> {\n return this.post<TEntity>(entity);\n }\n\n update(id: TId, entity: Partial<TEntity>): Observable<TEntity> {\n return this.put<TEntity>(entity, id.toString());\n }\n\n remove(id: TId): Observable<void> {\n return super.delete<void>(id.toString());\n }\n\n protected buildParams(pagination?: PaginationParams, filters?: Record<string, any>): any {\n const params: any = {};\n\n if (pagination) {\n params.pageIndex = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n\n if (filters) {\n Object.assign(params, filters);\n }\n\n return params;\n }\n}\n\n@Injectable()\nexport class SearchableGenericRepository<TEntity = any, TId extends string | number = number>\n extends GenericRepository<TEntity, TId>\n implements SearchableRepository<TEntity, TId>\n{\n search(query: string, pagination: PaginationParams): Observable<PagedResult<TEntity>> {\n const searchFilters = { q: query };\n const params = this.buildParams(pagination, searchFilters);\n return this.get<PagedResult<TEntity>>(params, 'search');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository } from '@acontplus/ng-config';\n\n@Injectable({ providedIn: 'root' })\nexport class RepositoryFactory {\n private readonly http = inject(HttpClient);\n\n create<TEntity, TId extends string | number = number>(\n config: RepositoryConfig,\n ): BaseRepository<TEntity, TId> {\n const buildUrl = (path = '') => {\n const baseUrl = config.baseUrl || '/api';\n const version = config.version ? `/v${config.version}` : '';\n const endpoint = path ? `${config.endpoint}/${path}` : config.endpoint;\n return `${baseUrl}${version}/${endpoint}`.replaceAll(/\\/+/g, '/');\n };\n\n const buildParams = (pagination?: PaginationParams) => {\n const params: any = {};\n if (pagination) {\n params.page = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n return params;\n };\n\n // Safe ID conversion function\n const idToString = (id: TId): string => {\n if (typeof id === 'string' || typeof id === 'number' || typeof id === 'bigint') {\n return id.toString();\n }\n // Fallback for other types - you might want to handle this differently\n return String(id);\n };\n\n return {\n getById: (id: TId) => this.http.get<TEntity>(buildUrl(idToString(id))),\n\n getAll: (pagination?) =>\n this.http.get<PagedResult<TEntity>>(buildUrl(), {\n params: buildParams(pagination),\n }),\n\n create: (entity: Partial<TEntity>) => this.http.post<TEntity>(buildUrl(), entity),\n\n update: (id: TId, entity: Partial<TEntity>) =>\n this.http.put<TEntity>(buildUrl(idToString(id)), entity),\n\n remove: (id: TId) => this.http.delete<void>(buildUrl(idToString(id))),\n };\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { HttpOptions, HttpPort } from '@acontplus/core';\n\nfunction mergeUrl(baseURL: string | undefined, endpoint: string): string {\n if (!baseURL) return endpoint;\n return `${baseURL.replace(/\\/+$/, '')}/${endpoint.replace(/^\\/+/, '')}`;\n}\n\nexport class AngularHttpAdapter implements HttpPort {\n constructor(\n private readonly http: HttpClient,\n private readonly baseURL?: string,\n ) {}\n\n private buildOptions(options?: HttpOptions) {\n return {\n headers: options?.headers ?? {},\n params: options?.params ?? {},\n };\n }\n\n private async request<T>(params: {\n method: 'get' | 'post' | 'put' | 'delete';\n url: string;\n data?: unknown;\n options?: HttpOptions;\n }): Promise<T> {\n const fullUrl = mergeUrl(this.baseURL, params.url);\n const httpOptions = this.buildOptions(params.options);\n\n const observable = this.http.request<T>(params.method, fullUrl, {\n body: params.data,\n ...httpOptions,\n });\n\n return await lastValueFrom(observable);\n }\n\n /** GET */\n get<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'get', url, options });\n }\n\n /** POST */\n post<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'post', url, data, options });\n }\n\n /** PUT */\n put<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'put', url, data, options });\n }\n\n /** DELETE */\n delete<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'delete', url, options });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CORE_CONFIG, DEFAULT_CONFIG, ENVIRONMENT } from '@acontplus/ng-config';\nimport { CoreConfig } from '@acontplus/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CoreConfigService {\n private config: Required<CoreConfig>;\n private readonly environment = inject(ENVIRONMENT);\n\n constructor() {\n this.config = this.initializeConfig();\n }\n\n /**\n * Initialize configuration with defaults and environment overrides\n */\n private initializeConfig(): Required<CoreConfig> {\n const injectedConfig = inject(CORE_CONFIG, { optional: true });\n\n return {\n ...DEFAULT_CONFIG,\n // Environment overrides\n apiBaseUrl: this.environment.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl,\n enableRequestLogging: !this.environment.isProduction,\n // Injected config overrides\n ...injectedConfig,\n };\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): Required<CoreConfig> {\n return { ...this.config };\n }\n\n /**\n * Update configuration at runtime\n */\n updateConfig(updates: Partial<CoreConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n /**\n * Get a specific configuration value\n */\n get<K extends keyof CoreConfig>(key: K): CoreConfig[K] {\n return this.config[key];\n }\n\n /**\n * Check if a feature is enabled\n */\n isFeatureEnabled(feature: keyof CoreConfig): boolean {\n const value = this.config[feature];\n return typeof value === 'boolean' ? value : false;\n }\n\n /**\n * Get API URL for a specific entity\n */\n getApiUrl(entityName?: string): string {\n const baseUrl = this.config.apiBaseUrl;\n if (!entityName) return baseUrl;\n return `${baseUrl}/${entityName}`.replaceAll(/\\/+/g, '/');\n }\n\n /**\n * Check if a URL should be excluded from processing\n */\n shouldExcludeUrl(url: string): boolean {\n return this.config.excludeUrls.some(\n (excludePattern) => url.includes(excludePattern) || new RegExp(excludePattern).test(url),\n );\n }\n\n /**\n * Check if a method should be excluded from processing\n */\n shouldExcludeMethod(method: string): boolean {\n return this.config.excludeMethods.some(\n (excludeMethod) => excludeMethod.toLowerCase() === method.toLowerCase(),\n );\n }\n\n /**\n * Get custom headers with dynamic values resolved\n */\n getCustomHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n Object.entries(this.config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n return headers;\n }\n\n /**\n * Reset configuration to defaults\n */\n resetConfig(): void {\n this.config = this.initializeConfig();\n }\n}\n\n// Provider function for easy setup\nexport function provideCoreConfig(config: Partial<CoreConfig> = {}) {\n return [\n {\n provide: CORE_CONFIG,\n useValue: config,\n },\n ];\n}\n\n// Helper function to create configuration\nexport function createCoreConfig(overrides: Partial<CoreConfig> = {}): CoreConfig {\n return {\n ...DEFAULT_CONFIG,\n ...overrides,\n };\n}\n","import { Observable } from 'rxjs';\n\nexport interface UseCase<TRequest = void, TResponse = void> {\n execute(request: TRequest): Observable<TResponse>;\n}\n\nexport abstract class BaseUseCase<TRequest = void, TResponse = void> implements UseCase<\n TRequest,\n TResponse\n> {\n abstract execute(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\n// Only create commands if you have complex validation logic\nexport abstract class Command<TRequest, TResponse = void> extends BaseUseCase<TRequest, TResponse> {\n // Simple validation - override only when needed\n protected validate(_request: TRequest): string[] {\n return []; // Return array of error messages\n }\n\n override execute(request: TRequest): Observable<TResponse> {\n const errors = this.validate(request);\n if (errors.length > 0) {\n return throwError(() => ({\n status: 'error',\n code: 'VALIDATION_FAILED',\n message: 'Validation failed',\n errors: errors.map((msg) => ({ code: 'VALIDATION', message: msg })),\n timestamp: new Date().toISOString(),\n }));\n }\n\n return this.executeInternal(request).pipe(\n catchError((error) => {\n // Log the error for debugging\n const logger = inject(LoggingService);\n logger.error('An error occurred during command execution:', error);\n\n // Re-throw the error so the caller can handle it\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\nexport abstract class Query<TRequest, TResponse> extends BaseUseCase<TRequest, TResponse> {\n override execute(request: TRequest): Observable<TResponse> {\n return this.executeInternal(request).pipe(\n catchError((error) => {\n const logger = inject(LoggingService);\n logger.error('An error occurred during query execution:', error);\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4","DEFAULT_CONFIG","catchError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acontplus-ng-infrastructure.mjs","sources":["../../../../packages/ng-infrastructure/src/lib/services/language-info.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/api-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/services/logging-service.ts","../../../../packages/ng-infrastructure/src/lib/services/tenant-info.ts","../../../../packages/ng-infrastructure/src/lib/services/correlation-info.ts","../../../../packages/ng-infrastructure/src/lib/utils/url.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/http-context-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/interceptors/spinner-interceptor.ts","../../../../packages/ng-infrastructure/src/lib/repositories/base-http-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/generic-repository.ts","../../../../packages/ng-infrastructure/src/lib/repositories/repository-factory.ts","../../../../packages/ng-infrastructure/src/lib/adapters/angular-http-adapter.ts","../../../../packages/ng-infrastructure/src/lib/services/core-config-service.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/base-use-case.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/commands.ts","../../../../packages/ng-infrastructure/src/lib/use-cases/queries.ts","../../../../packages/ng-infrastructure/src/acontplus-ng-infrastructure.ts"],"sourcesContent":["import { Injectable, signal, computed, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n Language,\n bcp47ToLanguage,\n detectBrowserLanguage,\n detectBrowserLanguages,\n languageToBcp47,\n} from '@acontplus/core';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\n\nconst LANGUAGE_STORAGE_KEY = 'acontplus-language';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LanguageInfo {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly authToken = inject(AUTH_TOKEN, { optional: true });\n private readonly _language = signal<Language>(Language.English);\n private readonly _bcp47 = signal<string>('en');\n private initialized = false;\n\n readonly language = computed(() => this._language());\n readonly bcp47Tag = computed(() => this._bcp47());\n\n getCurrentLanguage(): Language {\n this.ensureInitialized();\n return this._language();\n }\n\n getBcp47Tag(): string {\n this.ensureInitialized();\n return this._bcp47();\n }\n\n getBrowserLanguages(): string[] {\n return detectBrowserLanguages();\n }\n\n setLanguage(language: Language): void {\n this._language.set(language);\n this._bcp47.set(languageToBcp47(language));\n if (isPlatformBrowser(this.platformId)) {\n sessionStorage.setItem(LANGUAGE_STORAGE_KEY, language.toString());\n }\n }\n\n private ensureInitialized(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n if (!isPlatformBrowser(this.platformId)) {\n this._language.set(Language.English);\n this._bcp47.set('en');\n return;\n }\n\n const userLocale = this.authToken?.getUserData?.()?.locale;\n if (userLocale) {\n this._language.set(this.resolveLanguage(userLocale));\n this._bcp47.set(languageToBcp47(this._language()));\n return;\n }\n\n const stored = sessionStorage.getItem(LANGUAGE_STORAGE_KEY);\n if (stored) {\n const parsed = Number(stored) as Language;\n if (parsed > 0) {\n this._language.set(parsed);\n this._bcp47.set(languageToBcp47(parsed));\n return;\n }\n }\n\n const browserLang = detectBrowserLanguage();\n this._language.set(browserLang);\n this._bcp47.set(languageToBcp47(browserLang));\n }\n\n private resolveLanguage(locale: string): Language {\n return bcp47ToLanguage(locale);\n }\n}\n","import {\n HttpInterceptorFn,\n HttpEvent,\n HttpResponse,\n HttpErrorResponse,\n HttpRequest,\n HttpContextToken,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { catchError, switchMap, of, throwError, Observable } from 'rxjs';\nimport {\n ApiResponse,\n getLocalizedErrorMessage,\n getLocalizedAppMessage,\n AppMessageKey,\n} from '@acontplus/core';\nimport { NotificationService } from '@acontplus/ng-notifications';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\nimport { LanguageInfo } from '../services/language-info';\n\n//const RETRY_COUNT = 2;\n\n// ---------------------------------------------------------------------------\n// HTTP Context Tokens\n// ---------------------------------------------------------------------------\n\n/**\n * Skip all toast notifications for a specific request.\n * Usage: new HttpContext().set(SKIP_NOTIFICATION, true)\n */\nexport const SKIP_NOTIFICATION = new HttpContextToken<boolean>(() => false);\n\n/**\n * Force-show or force-hide notifications, overriding URL/method exclusion logic.\n * Usage: new HttpContext().set(SHOW_NOTIFICATIONS, true)\n */\nexport const SHOW_NOTIFICATIONS = new HttpContextToken<boolean | undefined>(() => undefined);\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nexport const apiInterceptor: HttpInterceptorFn = (req, next) => {\n const toastr = inject(NotificationService);\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n const languageInfo = inject(LanguageInfo);\n\n // Attach Bearer token when available\n const token = tokenProvider?.getToken();\n const modifiedReq = token ? req.clone({ setHeaders: { Authorization: `Bearer ${token}` } }) : req;\n\n return next(modifiedReq).pipe(\n // Retry only on network errors or 5xx — never on 4xx client errors.\n // Shows toast + updates spinner message so the user knows what is happening.\n // retry({\n // count: RETRY_COUNT,\n // delay: (error: HttpErrorResponse, attempt) => {\n // const isRetryable = error.status === 0 || (error.status >= 500 && error.status < 600);\n // if (!isRetryable) throw error; // 4xx — bubble up immediately, no retry\n\n // // Toast informa al usuario\n // toastr.warning({\n // message: `Reintentando solicitud (${attempt} de ${RETRY_COUNT})...`,\n // title: 'Conexión inestable',\n // config: { duration: 2500 },\n // });\n\n // return timer(1000 * attempt);\n // },\n // }),\n\n // Handle successful responses via switchMap so we can return an Observable\n // (needed to properly throw ApiResponse errors into the RxJS stream).\n switchMap((event: HttpEvent<unknown>) => {\n if (event instanceof HttpResponse) {\n const standardized = standardizeApiResponse(event.body, languageInfo);\n handleToastNotifications(standardized, toastr, req, languageInfo);\n\n if (standardized.status === 'error') {\n handleApiResponseError(standardized, toastr, req, languageInfo);\n return throwError(() => standardized);\n }\n\n return of(transformResponseForConsumers(standardized, event));\n }\n return of(event);\n }),\n\n // Handle HTTP-level errors — show notification for critical errors, always re-throw.\n catchError((error: HttpErrorResponse) => {\n return handleHttpError(error, toastr, languageInfo);\n }),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Standardisation\n// ---------------------------------------------------------------------------\n\nfunction standardizeApiResponse(body: unknown, languageInfo: LanguageInfo): ApiResponse<unknown> {\n if (isValidApiResponse(body)) return body;\n\n if (body !== null && body !== undefined) {\n return wrapSuccess(body, languageInfo);\n }\n\n return wrapSuccess(undefined, languageInfo);\n}\n\nfunction wrapSuccess(data: unknown, languageInfo: LanguageInfo): ApiResponse<unknown> {\n return {\n status: 'success',\n code: '200',\n message: getLocalizedAppMessage(\n AppMessageKey.OPERATION_COMPLETED,\n languageInfo.getCurrentLanguage(),\n ),\n data,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction isValidApiResponse(response: unknown): response is ApiResponse<unknown> {\n if (response === null || typeof response !== 'object') return false;\n const r = response as Record<string, unknown>;\n return (\n 'status' in r &&\n 'code' in r &&\n typeof r['status'] === 'string' &&\n ['success', 'error', 'warning'].includes(r['status'] as string)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Notifications\n// ---------------------------------------------------------------------------\n\nfunction handleToastNotifications(\n response: ApiResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n languageInfo: LanguageInfo,\n): void {\n // SKIP_NOTIFICATION always wins — even over SHOW_NOTIFICATIONS\n if (req.context.get(SKIP_NOTIFICATION)) return;\n\n const forceShow = req.context.get(SHOW_NOTIFICATIONS);\n const autoShow = shouldShowSuccessToast(req);\n const showNotifications = forceShow !== undefined ? forceShow : autoShow;\n\n if (!showNotifications) return;\n if (!response.message) return;\n if (!(['success', 'warning', 'error'] as string[]).includes(response.status)) return;\n\n // Primary notification — show main message once\n notificationService.show({\n type: response.status as 'success' | 'warning' | 'error',\n message: response.message,\n });\n\n // Secondary: show individual warnings only when no primary message covered them\n if (response.status === 'warning' && response.warnings?.length && response.message) {\n response.warnings.forEach((w) =>\n notificationService.show({\n type: 'warning',\n message: getLocalizedErrorMessage(w.code, languageInfo.getCurrentLanguage(), w.message),\n }),\n );\n }\n\n // Secondary: show individual errors only when no primary message covered them\n if (response.status === 'error' && response.errors?.length && response.message) {\n response.errors.forEach((e) =>\n notificationService.show({\n type: 'error',\n message: getLocalizedErrorMessage(e.code, languageInfo.getCurrentLanguage(), e.message),\n }),\n );\n }\n}\n\nfunction handleApiResponseError(\n response: ApiResponse<unknown>,\n notificationService: NotificationService,\n req: HttpRequest<unknown>,\n languageInfo: LanguageInfo,\n): void {\n if (req.context.get(SKIP_NOTIFICATION)) return;\n\n const language = languageInfo.getCurrentLanguage();\n const serverMessage = response.message || response.errors?.[0]?.message;\n const errorCode = response.errors?.[0]?.code ?? '';\n const message =\n serverMessage ||\n getLocalizedErrorMessage(errorCode, language) ||\n getLocalizedAppMessage(AppMessageKey.UNEXPECTED_ERROR, language);\n\n notificationService.error({ message, config: { duration: 5000 } });\n}\n\n// ---------------------------------------------------------------------------\n// Response transformation\n// ---------------------------------------------------------------------------\n\nfunction transformResponseForConsumers(\n response: ApiResponse<unknown>,\n originalEvent: HttpResponse<unknown>,\n): HttpResponse<unknown> {\n switch (response.status) {\n case 'success':\n case 'warning':\n // Unwrap data for consumers; fall back to full envelope when no data\n return response.data !== undefined && response.data !== null\n ? originalEvent.clone({ body: response.data })\n : originalEvent.clone({ body: response });\n\n case 'error':\n default:\n return originalEvent.clone({ body: response });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Error handling\n// ---------------------------------------------------------------------------\n\nfunction handleHttpError(\n error: HttpErrorResponse,\n notificationService: NotificationService,\n languageInfo: LanguageInfo,\n): Observable<never> {\n if (shouldShowCriticalErrorNotification(error.status)) {\n notificationService.error({\n message: getCriticalErrorMessage(error, languageInfo),\n title: getErrorTitle(error.status, languageInfo),\n config: { duration: 5000 },\n });\n }\n return throwError(() => error);\n}\n\nfunction shouldShowCriticalErrorNotification(status: number): boolean {\n return status === 0 || (status >= 500 && status < 600);\n}\n\nfunction getErrorTitle(status: number, languageInfo: LanguageInfo): string {\n const lang = languageInfo.getCurrentLanguage();\n if (status === 0) return getLocalizedAppMessage(AppMessageKey.CONNECTION_ERROR, lang);\n if (status >= 500) return getLocalizedAppMessage(AppMessageKey.SERVER_ERROR, lang);\n return getLocalizedAppMessage(AppMessageKey.ERROR, lang);\n}\n\nfunction getCriticalErrorMessage(error: HttpErrorResponse, languageInfo: LanguageInfo): string {\n const lang = languageInfo.getCurrentLanguage();\n if (error.status === 0) {\n return (\n getLocalizedErrorMessage('NETWORK_ERROR', lang) ||\n getLocalizedAppMessage(AppMessageKey.NETWORK_UNAVAILABLE, lang)\n );\n }\n if (error.status >= 500) {\n return (\n error.error?.message ??\n getLocalizedErrorMessage('INTERNAL_ERROR', lang) ??\n error.message ??\n getLocalizedAppMessage(AppMessageKey.UNEXPECTED_ERROR, lang)\n );\n }\n return (\n error.error?.message ??\n getLocalizedErrorMessage('UNHANDLED_ERROR', lang) ??\n error.message ??\n getLocalizedAppMessage(AppMessageKey.UNEXPECTED_ERROR, lang)\n );\n}\n\n// ---------------------------------------------------------------------------\n// Utility: decide whether to auto-show toast\n// ---------------------------------------------------------------------------\n\nconst MUTABLE_METHODS = new Set(['post', 'put', 'patch', 'delete']);\n\nconst EXCLUDED_URL_PATTERNS = [\n '/list',\n '/search',\n '/query',\n '/page',\n '/paginated',\n '/health',\n '/status',\n '/ping',\n];\n\nfunction shouldShowSuccessToast(req: HttpRequest<unknown>): boolean {\n const method = req.method.toLowerCase();\n const url = req.url.toLowerCase();\n\n if (!MUTABLE_METHODS.has(method)) return false;\n if (EXCLUDED_URL_PATTERNS.some((p) => url.includes(p))) return false;\n\n return true;\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\nimport { HttpRequestLog, HttpErrorLog } from '../interceptors';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LoggingService {\n private readonly environment = inject(ENVIRONMENT);\n\n log(level: 'info' | 'warn' | 'error', message: string, context?: unknown): void {\n if (this.environment.isProduction) {\n // Production logging (e.g., to external service)\n this.logToExternalService(level, message, context);\n return;\n }\n console[level](`[${level.toUpperCase()}] ${message}`, context);\n }\n\n info(message: string, context?: unknown): void {\n this.log('info', message, context);\n }\n\n warn(message: string, context?: unknown): void {\n this.log('warn', message, context);\n }\n\n error(message: string, context?: unknown): void {\n this.log('error', message, context);\n }\n\n // HTTP Request Logging\n logHttpRequest(log: HttpRequestLog): void {\n this.info(`HTTP Request - ${log.method} ${log.url}`, {\n requestId: log.requestId,\n correlationId: log.correlationId,\n tenantId: log.tenantId,\n headers: log.headers,\n isCustomUrl: log.isCustomUrl,\n timestamp: log.timestamp,\n });\n }\n\n // HTTP Error Logging\n logHttpError(error: HttpErrorLog): void {\n this.error(`HTTP Error - ${error.method} ${error.url}`, {\n status: error.status,\n statusText: error.statusText,\n requestId: error.requestId,\n correlationId: error.correlationId,\n tenantId: error.tenantId,\n errorDetails: error.errorDetails,\n environment: error.environment,\n timestamp: error.timestamp,\n });\n }\n\n // Network Error Logging\n logNetworkError(correlationId: string): void {\n this.error('Network connection failed', {\n type: 'network-error',\n correlationId,\n userAgent: navigator.userAgent,\n online: navigator.onLine,\n });\n }\n\n // Rate Limit Error Logging\n logRateLimitError(correlationId: string, url: string): void {\n this.warn('Rate limit exceeded', {\n type: 'rate-limit-error',\n correlationId,\n url,\n });\n }\n\n private logToExternalService(_level: string, _message: string, _context?: unknown): void {\n // Implement external logging service integration\n // e.g., Sentry, LogRocket, etc.\n // This is a placeholder for production logging implementation\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { LoggingService } from './logging-service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TenantInfo {\n private tenantId: string | null = null;\n private readonly logger = inject(LoggingService);\n\n getTenantId(): string {\n if (!this.tenantId) {\n // Get from localStorage, sessionStorage, or JWT token\n this.tenantId =\n localStorage.getItem('tenantId') ||\n sessionStorage.getItem('tenantId') ||\n this.extractTenantFromToken() ||\n 'default-tenant';\n }\n return this.tenantId;\n }\n\n getCurrentTenant(): string | null {\n return this.tenantId;\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n localStorage.setItem('tenantId', tenantId);\n }\n\n handleForbidden(): void {\n this.logger.error('Access forbidden for tenant:', this.tenantId);\n // Redirect to tenant selection or show error message\n // this.router.navigate(['/tenant-access-denied']);\n }\n\n private extractTenantFromToken(): string | null {\n // Implementation depends on your JWT token structure\n // This is a placeholder\n return null;\n }\n\n clearTenant(): void {\n this.tenantId = null;\n localStorage.removeItem('tenantId');\n sessionStorage.removeItem('tenantId');\n }\n}\n","import { Injectable, signal, computed } from '@angular/core';\nimport { v4 as uuidv4 } from 'uuid';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CorrelationInfo {\n private readonly correlationId = signal<string | null>(null);\n private readonly CORRELATION_KEY = 'correlation-id';\n\n // Signal-based getter for reactive updates\n readonly currentCorrelationId = computed(() => this.correlationId());\n\n getOrCreateCorrelationId(): string {\n if (!this.correlationId()) {\n // Try to get from sessionStorage first (for page refreshes)\n const id = sessionStorage.getItem(this.CORRELATION_KEY) || uuidv4();\n this.correlationId.set(id);\n sessionStorage.setItem(this.CORRELATION_KEY, id);\n }\n return this.correlationId()!;\n }\n\n setCorrelationId(correlationId: string): void {\n this.correlationId.set(correlationId);\n sessionStorage.setItem(this.CORRELATION_KEY, correlationId);\n }\n\n resetCorrelationId(): void {\n this.correlationId.set(null);\n sessionStorage.removeItem(this.CORRELATION_KEY);\n }\n\n getId(): string {\n return this.getOrCreateCorrelationId();\n }\n}\n","/**\n * Returns whether a URL already identifies an external origin.\n *\n * Protocol-relative URLs are included because browsers resolve `//host/path`\n * against the current page protocol.\n */\nexport function isAbsoluteUrl(url: string): boolean {\n return /^(https?:)?\\/\\//i.test(url);\n}\n\n/**\n * Joins an API base URL and an endpoint path without changing URL protocols.\n *\n * This deliberately does not use `new URL(path, baseUrl)`: this function joins\n * an API prefix and endpoint, while the URL standard resolves relative\n * references and can discard a base path that does not end in `/`.\n */\nexport function joinApiUrl(baseUrl: string, path?: string): string {\n if (!path) {\n return baseUrl.replace(/\\/+$/, '');\n }\n\n if (isAbsoluteUrl(path)) {\n return path;\n }\n\n const normalizedBaseUrl = baseUrl.replace(/\\/+$/, '');\n if (!normalizedBaseUrl) {\n return path;\n }\n\n return `${normalizedBaseUrl}/${path.replace(/^\\/+/, '')}`;\n}\n","import { inject, InjectionToken } from '@angular/core';\nimport { Router } from '@angular/router';\nimport {\n HttpContextToken,\n HttpContext,\n HttpInterceptorFn,\n HttpErrorResponse,\n HttpRequest,\n} from '@angular/common/http';\nimport { catchError, throwError, switchMap, Observable } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\nimport { AUTH_TOKEN, ENVIRONMENT } from '@acontplus/ng-config';\nimport { TenantInfo } from '../services/tenant-info';\nimport { CorrelationInfo } from '../services/correlation-info';\nimport { LanguageInfo } from '../services/language-info';\nimport { LoggingService } from '../services/logging-service';\nimport { isAbsoluteUrl, joinApiUrl } from '../utils/url';\n\n// ---------------------------------------------------------------------------\n// HTTP Context Tokens & helpers\n// ---------------------------------------------------------------------------\n\n/** Mark a request as using an absolute URL (skip base-URL injection). */\nconst CUSTOM_URL = new HttpContextToken<boolean>(() => false);\n\n/** Skip all context headers (correlation, tenant, etc.) for this request. */\nconst SKIP_CONTEXT_HEADERS = new HttpContextToken<boolean>(() => false);\n\n/** Merge additional headers into the request at call-site. */\nconst CUSTOM_HEADERS = new HttpContextToken<Record<string, string>>(() => ({}));\n\nexport function customUrl(): HttpContext {\n return new HttpContext().set(CUSTOM_URL, true);\n}\n\nexport function skipContextHeaders(): HttpContext {\n return new HttpContext().set(SKIP_CONTEXT_HEADERS, true);\n}\n\nexport function withCustomHeaders(headers: Record<string, string>): HttpContext {\n return new HttpContext().set(CUSTOM_HEADERS, headers);\n}\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nexport interface HttpContextConfig {\n enableCorrelationTracking?: boolean;\n enableRequestLogging?: boolean;\n enableErrorLogging?: boolean;\n customHeaders?: Record<string, string | (() => string)>;\n clientVersion?: string;\n tenantIdHeader?: string;\n correlationIdHeader?: string;\n requestIdHeader?: string;\n timestampHeader?: string;\n /** URL substrings or regex patterns to exclude from header injection. */\n excludeUrls?: string[];\n /** URL substrings that should NOT receive an Authorization header. */\n skipAuthUrls?: string[];\n includeAuthToken?: boolean;\n baseUrlInjection?: boolean;\n /** Send Accept-Language header with the detected or configured language. */\n enableLanguageHeader?: boolean;\n /** Custom header name for language (default: 'Accept-Language'). */\n languageHeader?: string;\n /** Called when a 401 is received and a refresh token is available. */\n refreshTokenCallback?: () => Observable<{ token: string; refreshToken?: string }>;\n /** Called after a failed token refresh — should clear auth state. */\n logoutCallback?: () => void;\n}\n\nconst DEFAULT_CONFIG: Required<HttpContextConfig> = {\n enableCorrelationTracking: true,\n enableRequestLogging: false,\n enableErrorLogging: true,\n customHeaders: {},\n clientVersion: '1.0.0',\n tenantIdHeader: 'Tenant-Id',\n correlationIdHeader: 'Correlation-Id',\n requestIdHeader: 'Request-Id',\n timestampHeader: 'Timestamp',\n excludeUrls: [],\n skipAuthUrls: ['/login', '/register', '/refresh'],\n includeAuthToken: true,\n baseUrlInjection: true,\n enableLanguageHeader: true,\n languageHeader: 'Accept-Language',\n refreshTokenCallback: undefined as any,\n logoutCallback: undefined as any,\n};\n\nexport const HTTP_CONTEXT_CONFIG = new InjectionToken<HttpContextConfig>('HTTP_CONTEXT_CONFIG', {\n factory: () => DEFAULT_CONFIG,\n});\n\n// ---------------------------------------------------------------------------\n// Interceptor\n// ---------------------------------------------------------------------------\n\nexport const httpContextInterceptor: HttpInterceptorFn = (req, next) => {\n const tokenProvider = inject(AUTH_TOKEN, { optional: true });\n const router = inject(Router);\n const tenantService = inject(TenantInfo);\n const correlationService = inject(CorrelationInfo);\n const languageInfo = inject(LanguageInfo);\n const loggingService = inject(LoggingService);\n const environment = inject(ENVIRONMENT);\n\n const config: Required<HttpContextConfig> = {\n ...DEFAULT_CONFIG,\n enableRequestLogging: !environment.isProduction,\n ...inject(HTTP_CONTEXT_CONFIG, { optional: true }),\n };\n\n // ── Context token flags ──────────────────────────────────────────────────\n const isCustomUrl = req.context.get(CUSTOM_URL);\n const skipHeaders = req.context.get(SKIP_CONTEXT_HEADERS);\n const contextHeaders = req.context.get(CUSTOM_HEADERS);\n\n if (skipHeaders) return next(req);\n\n // ── URL exclusion (with ReDoS protection) ────────────────────────────────\n if (shouldExcludeUrl(req.url, config.excludeUrls)) return next(req);\n\n // ── Auth skip check ──────────────────────────────────────────────────────\n const skipAuth = shouldSkipAuth(req.url, config.skipAuthUrls);\n\n // ── URL resolution ───────────────────────────────────────────────────────\n const finalUrl = resolveFinalUrl(\n req.url,\n isCustomUrl,\n config.baseUrlInjection,\n environment.apiBaseUrl,\n );\n\n // ── Header construction ──────────────────────────────────────────────────\n const headers = buildHeaders(\n config,\n tokenProvider,\n correlationService,\n tenantService,\n languageInfo,\n environment,\n skipAuth,\n contextHeaders,\n req,\n );\n\n // ── Clone request ────────────────────────────────────────────────────────\n const enhancedReq = req.clone({ url: finalUrl, setHeaders: headers });\n\n // ── Request logging ──────────────────────────────────────────────────────\n if (config.enableRequestLogging) {\n logRequest(loggingService, req, finalUrl, headers, {\n requestId: headers[config.requestIdHeader],\n correlationId: headers[config.correlationIdHeader],\n tenantId: headers[config.tenantIdHeader],\n isCustomUrl,\n });\n }\n\n // ── Execute request with unified error handling ──────────────────────────\n const hasAuth = !!headers['Authorization'];\n\n // Shared error context for both handlers below\n const errorCtx = {\n req,\n finalUrl,\n requestId: headers[config.requestIdHeader],\n correlationId: headers[config.correlationIdHeader],\n tenantId: headers[config.tenantIdHeader],\n isCustomUrl,\n hasAuth,\n config,\n router,\n loggingService,\n tenantService,\n tokenProvider,\n environment,\n };\n\n // Base pipeline — always present\n const base$ = next(enhancedReq).pipe(\n catchError((error: HttpErrorResponse) => handleContextError(error, errorCtx)),\n );\n\n // When auth + refresh callback are available, prepend a 401-refresh layer\n if (!hasAuth || !config.refreshTokenCallback) {\n return base$;\n }\n\n return next(enhancedReq).pipe(\n // Intercept 401 first — attempt token refresh before general error handling\n catchError((error: HttpErrorResponse) => {\n if (error.status !== 401) return throwError(() => error);\n\n const refreshToken = tokenProvider?.getRefreshToken?.();\n if (!refreshToken?.trim()) return throwError(() => error);\n\n return config.refreshTokenCallback!().pipe(\n switchMap(({ token }) =>\n next(\n req.clone({\n url: finalUrl,\n setHeaders: { ...headers, Authorization: `Bearer ${token}` },\n }),\n ),\n ),\n catchError((refreshError) => {\n config.logoutCallback?.();\n return throwError(() => refreshError);\n }),\n );\n }),\n // General error handling (logs, redirects, tenant, rate-limit, etc.)\n catchError((error: HttpErrorResponse) => handleContextError(error, errorCtx)),\n );\n};\n\n// ---------------------------------------------------------------------------\n// Helper functions to reduce cognitive complexity\n// ---------------------------------------------------------------------------\n\nfunction shouldExcludeUrl(url: string, excludeUrls: string[]): boolean {\n return excludeUrls.some((pattern) => {\n try {\n return url.includes(pattern) || new RegExp(pattern).test(url);\n } catch {\n return false; // malformed regex — skip safely\n }\n });\n}\n\nfunction shouldSkipAuth(url: string, skipAuthUrls: string[]): boolean {\n return skipAuthUrls.some((u) => url.includes(u));\n}\n\nfunction resolveFinalUrl(\n url: string,\n isCustomUrl: boolean,\n baseUrlInjection: boolean,\n apiBaseUrl: string,\n): string {\n if (isCustomUrl || !baseUrlInjection || isAbsoluteUrl(url)) {\n return url;\n }\n\n return joinApiUrl(apiBaseUrl, url);\n}\n\nfunction buildHeaders(\n config: Required<HttpContextConfig>,\n tokenProvider: any,\n correlationService: CorrelationInfo,\n tenantService: TenantInfo,\n languageInfo: LanguageInfo,\n environment: any,\n skipAuth: boolean,\n contextHeaders: Record<string, string>,\n req: HttpRequest<unknown>,\n): Record<string, string> {\n const correlationId = config.enableCorrelationTracking\n ? correlationService.getOrCreateCorrelationId()\n : uuidv4();\n const tenantId = tenantService.getTenantId();\n const requestId = uuidv4();\n\n const headers: Record<string, string> = {\n [config.requestIdHeader]: requestId,\n [config.timestampHeader]: new Date().toISOString(),\n };\n\n if (config.enableCorrelationTracking) {\n headers[config.correlationIdHeader] = correlationId;\n }\n\n if (tenantId) {\n headers[config.tenantIdHeader] = tenantId;\n }\n\n if (config.enableLanguageHeader) {\n headers[config.languageHeader] = languageInfo.getBcp47Tag();\n }\n\n if (config.clientVersion) {\n headers['Client-Version'] = config.clientVersion;\n }\n\n if (environment.clientId) {\n headers['Client-Id'] = environment.clientId;\n }\n\n if (config.includeAuthToken && !skipAuth) {\n const authToken = tokenProvider?.getToken();\n if (authToken) headers['Authorization'] = `Bearer ${authToken}`;\n }\n\n // Static and dynamic custom headers from config\n Object.entries(config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n // Per-request headers from HttpContext\n Object.entries(contextHeaders).forEach(([key, value]) => {\n headers[key] = value;\n });\n\n // Content-Type for mutation requests (do not override if already set).\n // Only set application/json when the body is JSON-serializable.\n // Binary types (FormData, Blob, ArrayBuffer, etc.) need the browser to set Content-Type.\n if (\n ['POST', 'PUT', 'PATCH'].includes(req.method) &&\n !req.headers.has('Content-Type') &&\n isJsonBody(req.body)\n ) {\n headers['Content-Type'] = 'application/json';\n }\n\n return headers;\n}\n\nfunction logRequest(\n loggingService: LoggingService,\n req: HttpRequest<unknown>,\n finalUrl: string,\n headers: Record<string, string>,\n logData: { requestId: string; correlationId: string; tenantId: string; isCustomUrl: boolean },\n): void {\n loggingService.logHttpRequest({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId: logData.requestId,\n correlationId: logData.correlationId,\n tenantId: logData.tenantId,\n timestamp: new Date().toISOString(),\n headers: Object.keys(headers),\n isCustomUrl: logData.isCustomUrl,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Unified error handler (eliminates duplicated catchError blocks)\n// ---------------------------------------------------------------------------\n\ninterface ErrorContext {\n req: HttpRequest<unknown>;\n finalUrl: string;\n requestId: string;\n correlationId: string;\n tenantId: string;\n isCustomUrl: boolean;\n hasAuth: boolean;\n config: Required<HttpContextConfig>;\n router: Router;\n loggingService: LoggingService;\n tenantService: TenantInfo;\n tokenProvider: any;\n environment: any;\n}\n\nfunction handleContextError(error: HttpErrorResponse, ctx: ErrorContext) {\n const {\n req,\n finalUrl,\n requestId,\n correlationId,\n tenantId,\n isCustomUrl,\n config,\n router,\n loggingService,\n tenantService,\n environment,\n } = ctx;\n\n if (config.enableErrorLogging) {\n loggingService.logHttpError({\n method: req.method,\n url: finalUrl,\n originalUrl: req.url,\n requestId,\n correlationId,\n tenantId,\n status: error.status,\n statusText: error.statusText,\n message: error.message,\n timestamp: new Date().toISOString(),\n errorDetails: error.error,\n environment: environment.clientId,\n isCustomUrl,\n headers: [],\n });\n }\n\n switch (error.status) {\n case 401:\n loggingService.error('Unauthorized — redirecting to login');\n // Let auth service clear tokens before navigation\n config.logoutCallback?.();\n router.navigate([`/${environment.loginRoute}`]);\n break;\n case 403:\n tenantService.handleForbidden();\n break;\n case 0:\n loggingService.logNetworkError(correlationId);\n break;\n case 429:\n loggingService.logRateLimitError(correlationId, finalUrl);\n break;\n }\n\n return throwError(() => error);\n}\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nfunction isJsonBody(body: unknown): boolean {\n if (body === null || body === undefined) return true;\n if (typeof body === 'string' || typeof body === 'number' || typeof body === 'boolean')\n return true;\n if (Array.isArray(body)) return true;\n if (\n typeof body === 'object' &&\n !(body instanceof FormData) &&\n !(body instanceof Blob) &&\n !(body instanceof ArrayBuffer) &&\n !(body instanceof URLSearchParams)\n )\n return true;\n return false;\n}\n\nexport interface HttpRequestLog {\n method: string;\n url: string;\n originalUrl: string;\n requestId: string;\n correlationId: string;\n tenantId: string;\n timestamp: string;\n headers: string[];\n isCustomUrl: boolean;\n}\n\nexport interface HttpErrorLog extends HttpRequestLog {\n status: number;\n statusText: string;\n message: string;\n errorDetails: unknown;\n environment: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public helpers for library consumers\n// ---------------------------------------------------------------------------\n\nexport function createHttpContextConfig(\n overrides: Partial<HttpContextConfig> = {},\n): HttpContextConfig {\n return { ...DEFAULT_CONFIG, ...overrides };\n}\n\n/**\n * Register the interceptor configuration in your app providers.\n *\n * @example\n * // app.config.ts\n * provideHttpClient(\n * withInterceptors([\n * httpContextInterceptor, // 1st — adds headers, handles 401 refresh\n * apiInterceptor, // 2nd — normalises response, shows toasts\n * ])\n * ),\n * ...provideHttpContext({ clientVersion: '2.0.0' }),\n */\nexport function provideHttpContext(config: Partial<HttpContextConfig> = {}) {\n return [\n {\n provide: HTTP_CONTEXT_CONFIG,\n useValue: createHttpContextConfig(config),\n },\n ];\n}\n","import {\n HttpContext,\n HttpContextToken,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { finalize } from 'rxjs/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { OverlayService } from '@acontplus/ng-components';\n\nexport const SHOW_SPINNER = new HttpContextToken<boolean>(() => true);\n\nexport function withoutSpinner(): HttpContext {\n return new HttpContext().set(SHOW_SPINNER, false);\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ActiveRequestsTracker {\n private readonly requests: HttpRequest<unknown>[] = [];\n\n get count(): number {\n return this.requests.length;\n }\n\n /** Retorna true si se pasa de 0 → 1 (primera request activa). */\n add(request: HttpRequest<unknown>): boolean {\n this.requests.push(request);\n return this.requests.length === 1;\n }\n\n /** Retorna true si se pasa de 1 → 0 (última request completada). */\n remove(request: HttpRequest<unknown>): boolean {\n const index = this.requests.indexOf(request);\n if (index >= 0) {\n this.requests.splice(index, 1);\n }\n return this.requests.length === 0;\n }\n}\n\nexport const spinnerInterceptor: HttpInterceptorFn = (req, next) => {\n const activeRequests = inject(ActiveRequestsTracker);\n const overlayService = inject(OverlayService);\n\n if (!req.context.get(SHOW_SPINNER)) {\n return next(req);\n }\n\n // showSpinner solo cuando pasamos de 0 → 1 requests\n const isFirst = activeRequests.add(req);\n if (isFirst) {\n overlayService.showSpinner();\n }\n\n return next(req).pipe(\n finalize(() => {\n // hideSpinner solo cuando pasamos de 1 → 0 requests\n const isEmpty = activeRequests.remove(req);\n if (isEmpty) {\n overlayService.hideSpinner();\n }\n }),\n );\n};\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { RepositoryConfig } from '@acontplus/core';\nimport { joinApiUrl } from '../utils/url';\n\n@Injectable()\nexport abstract class BaseHttpRepository {\n protected http = inject(HttpClient);\n protected abstract config: RepositoryConfig; // Abstract property\n\n protected buildUrl(path = ''): string {\n const baseUrl = this.config.baseUrl || '/api';\n const version = this.config.version ? `v${this.config.version}` : '';\n const versionedBaseUrl = version ? joinApiUrl(baseUrl, version) : baseUrl;\n const endpoint = path ? joinApiUrl(this.config.endpoint, path) : this.config.endpoint;\n\n return joinApiUrl(versionedBaseUrl, endpoint);\n }\n\n protected get<T>(params?: Record<string, string | number | boolean>, path = ''): Observable<T> {\n return this.http.get<T>(this.buildUrl(path), { params });\n }\n\n protected post<T>(body: unknown, path = ''): Observable<T> {\n return this.http.post<T>(this.buildUrl(path), body);\n }\n\n protected put<T>(body: unknown, path = ''): Observable<T> {\n return this.http.put<T>(this.buildUrl(path), body);\n }\n\n protected patch<T>(body?: unknown, path = ''): Observable<T> {\n return this.http.patch<T>(this.buildUrl(path), body);\n }\n\n protected delete<T>(path = ''): Observable<T> {\n return this.http.delete<T>(this.buildUrl(path));\n }\n}\n","import { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BaseHttpRepository } from './base-http-repository';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository, SearchableRepository } from '@acontplus/ng-config';\n\n// Create an injection token for RepositoryConfig\nexport const REPOSITORY_CONFIG = new InjectionToken<RepositoryConfig>('REPOSITORY_CONFIG');\n\n@Injectable()\nexport class GenericRepository<TEntity = any, TId extends string | number = number>\n extends BaseHttpRepository\n implements BaseRepository<TEntity, TId>\n{\n protected override config: RepositoryConfig;\n\n constructor() {\n const config = inject<RepositoryConfig>(REPOSITORY_CONFIG);\n super();\n this.config = config;\n }\n\n getById(id: TId): Observable<TEntity> {\n return this.get<TEntity>(undefined, id.toString());\n }\n\n getAll(pagination?: PaginationParams): Observable<PagedResult<TEntity>> {\n const params = this.buildParams(pagination);\n return this.get<PagedResult<TEntity>>(params);\n }\n\n create(entity: Partial<TEntity>): Observable<TEntity> {\n return this.post<TEntity>(entity);\n }\n\n update(id: TId, entity: Partial<TEntity>): Observable<TEntity> {\n return this.put<TEntity>(entity, id.toString());\n }\n\n remove(id: TId): Observable<void> {\n return super.delete<void>(id.toString());\n }\n\n protected buildParams(pagination?: PaginationParams, filters?: Record<string, any>): any {\n const params: any = {};\n\n if (pagination) {\n params.pageIndex = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n\n if (filters) {\n Object.assign(params, filters);\n }\n\n return params;\n }\n}\n\n@Injectable()\nexport class SearchableGenericRepository<TEntity = any, TId extends string | number = number>\n extends GenericRepository<TEntity, TId>\n implements SearchableRepository<TEntity, TId>\n{\n search(query: string, pagination: PaginationParams): Observable<PagedResult<TEntity>> {\n const searchFilters = { q: query };\n const params = this.buildParams(pagination, searchFilters);\n return this.get<PagedResult<TEntity>>(params, 'search');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { PagedResult, PaginationParams, RepositoryConfig } from '@acontplus/core';\nimport { BaseRepository } from '@acontplus/ng-config';\nimport { joinApiUrl } from '../utils/url';\n\n@Injectable({ providedIn: 'root' })\nexport class RepositoryFactory {\n private readonly http = inject(HttpClient);\n\n create<TEntity, TId extends string | number = number>(\n config: RepositoryConfig,\n ): BaseRepository<TEntity, TId> {\n const buildUrl = (path = '') => {\n const baseUrl = config.baseUrl || '/api';\n const version = config.version ? `v${config.version}` : '';\n const versionedBaseUrl = version ? joinApiUrl(baseUrl, version) : baseUrl;\n const endpoint = path ? joinApiUrl(config.endpoint, path) : config.endpoint;\n return joinApiUrl(versionedBaseUrl, endpoint);\n };\n\n const buildParams = (pagination?: PaginationParams) => {\n const params: any = {};\n if (pagination) {\n params.page = pagination.pageIndex?.toString() || '1';\n params.pageSize = pagination.pageSize?.toString() || '20';\n if (pagination.sortBy) params.sortBy = pagination.sortBy;\n if (pagination.sortDirection) params.sortDirection = pagination.sortDirection;\n }\n return params;\n };\n\n // Safe ID conversion function\n const idToString = (id: TId): string => {\n if (typeof id === 'string' || typeof id === 'number' || typeof id === 'bigint') {\n return id.toString();\n }\n // Fallback for other types - you might want to handle this differently\n return String(id);\n };\n\n return {\n getById: (id: TId) => this.http.get<TEntity>(buildUrl(idToString(id))),\n\n getAll: (pagination?) =>\n this.http.get<PagedResult<TEntity>>(buildUrl(), {\n params: buildParams(pagination),\n }),\n\n create: (entity: Partial<TEntity>) => this.http.post<TEntity>(buildUrl(), entity),\n\n update: (id: TId, entity: Partial<TEntity>) =>\n this.http.put<TEntity>(buildUrl(idToString(id)), entity),\n\n remove: (id: TId) => this.http.delete<void>(buildUrl(idToString(id))),\n };\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { HttpOptions, HttpPort } from '@acontplus/core';\nimport { joinApiUrl } from '../utils/url';\n\nexport class AngularHttpAdapter implements HttpPort {\n constructor(\n private readonly http: HttpClient,\n private readonly baseURL?: string,\n ) {}\n\n private buildOptions(options?: HttpOptions) {\n return {\n headers: options?.headers ?? {},\n params: options?.params ?? {},\n };\n }\n\n private async request<T>(params: {\n method: 'get' | 'post' | 'put' | 'delete';\n url: string;\n data?: unknown;\n options?: HttpOptions;\n }): Promise<T> {\n const fullUrl = this.baseURL ? joinApiUrl(this.baseURL, params.url) : params.url;\n const httpOptions = this.buildOptions(params.options);\n\n const observable = this.http.request<T>(params.method, fullUrl, {\n body: params.data,\n ...httpOptions,\n });\n\n return await lastValueFrom(observable);\n }\n\n /** GET */\n get<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'get', url, options });\n }\n\n /** POST */\n post<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'post', url, data, options });\n }\n\n /** PUT */\n put<T>(url: string, data?: unknown, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'put', url, data, options });\n }\n\n /** DELETE */\n delete<T>(url: string, options?: HttpOptions): Promise<T> {\n return this.request({ method: 'delete', url, options });\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CORE_CONFIG, DEFAULT_CONFIG, ENVIRONMENT } from '@acontplus/ng-config';\nimport { CoreConfig } from '@acontplus/core';\nimport { joinApiUrl } from '../utils/url';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CoreConfigService {\n private config: Required<CoreConfig>;\n private readonly environment = inject(ENVIRONMENT);\n\n constructor() {\n this.config = this.initializeConfig();\n }\n\n /**\n * Initialize configuration with defaults and environment overrides\n */\n private initializeConfig(): Required<CoreConfig> {\n const injectedConfig = inject(CORE_CONFIG, { optional: true });\n\n return {\n ...DEFAULT_CONFIG,\n // Environment overrides\n apiBaseUrl: this.environment.apiBaseUrl || DEFAULT_CONFIG.apiBaseUrl,\n enableRequestLogging: !this.environment.isProduction,\n // Injected config overrides\n ...injectedConfig,\n };\n }\n\n /**\n * Get the current configuration\n */\n getConfig(): Required<CoreConfig> {\n return { ...this.config };\n }\n\n /**\n * Update configuration at runtime\n */\n updateConfig(updates: Partial<CoreConfig>): void {\n this.config = { ...this.config, ...updates };\n }\n\n /**\n * Get a specific configuration value\n */\n get<K extends keyof CoreConfig>(key: K): CoreConfig[K] {\n return this.config[key];\n }\n\n /**\n * Check if a feature is enabled\n */\n isFeatureEnabled(feature: keyof CoreConfig): boolean {\n const value = this.config[feature];\n return typeof value === 'boolean' ? value : false;\n }\n\n /**\n * Get API URL for a specific entity\n */\n getApiUrl(entityName?: string): string {\n const baseUrl = this.config.apiBaseUrl;\n if (!entityName) return baseUrl;\n return joinApiUrl(baseUrl, entityName);\n }\n\n /**\n * Check if a URL should be excluded from processing\n */\n shouldExcludeUrl(url: string): boolean {\n return this.config.excludeUrls.some(\n (excludePattern) => url.includes(excludePattern) || new RegExp(excludePattern).test(url),\n );\n }\n\n /**\n * Check if a method should be excluded from processing\n */\n shouldExcludeMethod(method: string): boolean {\n return this.config.excludeMethods.some(\n (excludeMethod) => excludeMethod.toLowerCase() === method.toLowerCase(),\n );\n }\n\n /**\n * Get custom headers with dynamic values resolved\n */\n getCustomHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n Object.entries(this.config.customHeaders).forEach(([key, value]) => {\n headers[key] = typeof value === 'function' ? value() : value;\n });\n\n return headers;\n }\n\n /**\n * Reset configuration to defaults\n */\n resetConfig(): void {\n this.config = this.initializeConfig();\n }\n}\n\n// Provider function for easy setup\nexport function provideCoreConfig(config: Partial<CoreConfig> = {}) {\n return [\n {\n provide: CORE_CONFIG,\n useValue: config,\n },\n ];\n}\n\n// Helper function to create configuration\nexport function createCoreConfig(overrides: Partial<CoreConfig> = {}): CoreConfig {\n return {\n ...DEFAULT_CONFIG,\n ...overrides,\n };\n}\n","import { Observable } from 'rxjs';\n\nexport interface UseCase<TRequest = void, TResponse = void> {\n execute(request: TRequest): Observable<TResponse>;\n}\n\nexport abstract class BaseUseCase<TRequest = void, TResponse = void> implements UseCase<\n TRequest,\n TResponse\n> {\n abstract execute(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\n// Only create commands if you have complex validation logic\nexport abstract class Command<TRequest, TResponse = void> extends BaseUseCase<TRequest, TResponse> {\n private readonly logger = inject(LoggingService);\n\n // Simple validation - override only when needed\n protected validate(_request: TRequest): string[] {\n return []; // Return array of error messages\n }\n\n override execute(request: TRequest): Observable<TResponse> {\n const errors = this.validate(request);\n if (errors.length > 0) {\n return throwError(() => ({\n status: 'error',\n code: 'VALIDATION_FAILED',\n message: 'Validation failed',\n errors: errors.map((msg) => ({ code: 'VALIDATION', message: msg })),\n timestamp: new Date().toISOString(),\n }));\n }\n\n return this.executeInternal(request).pipe(\n catchError((error) => {\n // Log the error for debugging\n this.logger.error('An error occurred during command execution:', error);\n\n // Re-throw the error so the caller can handle it\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","import { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { BaseUseCase } from './base-use-case';\nimport { LoggingService } from '../services/logging-service';\n\nexport abstract class Query<TRequest, TResponse> extends BaseUseCase<TRequest, TResponse> {\n private readonly logger = inject(LoggingService);\n\n override execute(request: TRequest): Observable<TResponse> {\n return this.executeInternal(request).pipe(\n catchError((error) => {\n this.logger.error('An error occurred during query execution:', error);\n return throwError(() => error);\n }),\n );\n }\n\n protected abstract executeInternal(request: TRequest): Observable<TResponse>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4","DEFAULT_CONFIG","catchError"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acontplus/ng-infrastructure",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Angular infrastructure library implementing clean architecture patterns with HTTP interceptors, repository implementations, adapters, dependency injection providers, and core infrastructure services for enterprise applications.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@acontplus/core": "^1.1.4",
|
|
7
|
-
"@acontplus/ng-config": "3.0.
|
|
8
|
-
"@acontplus/ng-notifications": "3.0.
|
|
9
|
-
"@acontplus/ng-components": "3.0.
|
|
7
|
+
"@acontplus/ng-config": "3.0.1",
|
|
8
|
+
"@acontplus/ng-notifications": "3.0.1",
|
|
9
|
+
"@acontplus/ng-components": "3.0.1",
|
|
10
10
|
"@angular/common": "^22.1.0",
|
|
11
11
|
"@angular/core": "^22.1.0",
|
|
12
|
+
"@angular/router": "^22.1.0",
|
|
12
13
|
"uuid": "13.0.0"
|
|
13
14
|
},
|
|
14
15
|
"sideEffects": false,
|
|
@@ -2,7 +2,7 @@ import { HttpContextToken, HttpInterceptorFn, HttpContext, HttpRequest, HttpClie
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { InjectionToken } from '@angular/core';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
|
-
import { RepositoryConfig, PaginationParams, PagedResult, HttpPort, HttpOptions, CoreConfig } from '@acontplus/core';
|
|
5
|
+
import { RepositoryConfig, PaginationParams, PagedResult, HttpPort, HttpOptions, CoreConfig, Language } from '@acontplus/core';
|
|
6
6
|
import { BaseRepository, SearchableRepository } from '@acontplus/ng-config';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -36,6 +36,10 @@ interface HttpContextConfig {
|
|
|
36
36
|
skipAuthUrls?: string[];
|
|
37
37
|
includeAuthToken?: boolean;
|
|
38
38
|
baseUrlInjection?: boolean;
|
|
39
|
+
/** Send Accept-Language header with the detected or configured language. */
|
|
40
|
+
enableLanguageHeader?: boolean;
|
|
41
|
+
/** Custom header name for language (default: 'Accept-Language'). */
|
|
42
|
+
languageHeader?: string;
|
|
39
43
|
/** Called when a 401 is received and a refresh token is available. */
|
|
40
44
|
refreshTokenCallback?: () => Observable<{
|
|
41
45
|
token: string;
|
|
@@ -217,6 +221,24 @@ declare class CorrelationInfo {
|
|
|
217
221
|
static ɵprov: i0.ɵɵInjectableDeclaration<CorrelationInfo>;
|
|
218
222
|
}
|
|
219
223
|
|
|
224
|
+
declare class LanguageInfo {
|
|
225
|
+
private readonly platformId;
|
|
226
|
+
private readonly authToken;
|
|
227
|
+
private readonly _language;
|
|
228
|
+
private readonly _bcp47;
|
|
229
|
+
private initialized;
|
|
230
|
+
readonly language: i0.Signal<Language>;
|
|
231
|
+
readonly bcp47Tag: i0.Signal<string>;
|
|
232
|
+
getCurrentLanguage(): Language;
|
|
233
|
+
getBcp47Tag(): string;
|
|
234
|
+
getBrowserLanguages(): string[];
|
|
235
|
+
setLanguage(language: Language): void;
|
|
236
|
+
private ensureInitialized;
|
|
237
|
+
private resolveLanguage;
|
|
238
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LanguageInfo, never>;
|
|
239
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<LanguageInfo>;
|
|
240
|
+
}
|
|
241
|
+
|
|
220
242
|
declare class LoggingService {
|
|
221
243
|
private readonly environment;
|
|
222
244
|
log(level: 'info' | 'warn' | 'error', message: string, context?: unknown): void;
|
|
@@ -232,6 +254,19 @@ declare class LoggingService {
|
|
|
232
254
|
static ɵprov: i0.ɵɵInjectableDeclaration<LoggingService>;
|
|
233
255
|
}
|
|
234
256
|
|
|
257
|
+
declare class TenantInfo {
|
|
258
|
+
private tenantId;
|
|
259
|
+
private readonly logger;
|
|
260
|
+
getTenantId(): string;
|
|
261
|
+
getCurrentTenant(): string | null;
|
|
262
|
+
setTenantId(tenantId: string): void;
|
|
263
|
+
handleForbidden(): void;
|
|
264
|
+
private extractTenantFromToken;
|
|
265
|
+
clearTenant(): void;
|
|
266
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TenantInfo, never>;
|
|
267
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TenantInfo>;
|
|
268
|
+
}
|
|
269
|
+
|
|
235
270
|
interface UseCase<TRequest = void, TResponse = void> {
|
|
236
271
|
execute(request: TRequest): Observable<TResponse>;
|
|
237
272
|
}
|
|
@@ -240,15 +275,17 @@ declare abstract class BaseUseCase<TRequest = void, TResponse = void> implements
|
|
|
240
275
|
}
|
|
241
276
|
|
|
242
277
|
declare abstract class Command<TRequest, TResponse = void> extends BaseUseCase<TRequest, TResponse> {
|
|
278
|
+
private readonly logger;
|
|
243
279
|
protected validate(_request: TRequest): string[];
|
|
244
280
|
execute(request: TRequest): Observable<TResponse>;
|
|
245
281
|
protected abstract executeInternal(request: TRequest): Observable<TResponse>;
|
|
246
282
|
}
|
|
247
283
|
|
|
248
284
|
declare abstract class Query<TRequest, TResponse> extends BaseUseCase<TRequest, TResponse> {
|
|
285
|
+
private readonly logger;
|
|
249
286
|
execute(request: TRequest): Observable<TResponse>;
|
|
250
287
|
protected abstract executeInternal(request: TRequest): Observable<TResponse>;
|
|
251
288
|
}
|
|
252
289
|
|
|
253
|
-
export { ActiveRequestsTracker, AngularHttpAdapter, BaseHttpRepository, BaseUseCase, Command, CoreConfigService, CorrelationInfo, GenericRepository, HTTP_CONTEXT_CONFIG, LoggingService, Query, REPOSITORY_CONFIG, RepositoryFactory, SHOW_NOTIFICATIONS, SHOW_SPINNER, SKIP_NOTIFICATION, SearchableGenericRepository, apiInterceptor, createCoreConfig, createHttpContextConfig, customUrl, httpContextInterceptor, provideCoreConfig, provideHttpContext, skipContextHeaders, spinnerInterceptor, withCustomHeaders, withoutSpinner };
|
|
290
|
+
export { ActiveRequestsTracker, AngularHttpAdapter, BaseHttpRepository, BaseUseCase, Command, CoreConfigService, CorrelationInfo, GenericRepository, HTTP_CONTEXT_CONFIG, LanguageInfo, LoggingService, Query, REPOSITORY_CONFIG, RepositoryFactory, SHOW_NOTIFICATIONS, SHOW_SPINNER, SKIP_NOTIFICATION, SearchableGenericRepository, TenantInfo, apiInterceptor, createCoreConfig, createHttpContextConfig, customUrl, httpContextInterceptor, provideCoreConfig, provideHttpContext, skipContextHeaders, spinnerInterceptor, withCustomHeaders, withoutSpinner };
|
|
254
291
|
export type { HttpContextConfig, HttpErrorLog, HttpRequestLog, UseCase };
|