2026-02-28 17:42:36 +04:00
|
|
|
import { HttpInterceptorFn } from '@angular/common/http';
|
|
|
|
|
import { inject } from '@angular/core';
|
|
|
|
|
import { LocationService } from '../services/location.service';
|
|
|
|
|
import { LanguageService } from '../services/language.service';
|
2026-03-24 00:09:11 +04:00
|
|
|
import { AuthService } from '../services/auth.service';
|
2026-02-28 17:42:36 +04:00
|
|
|
import { environment } from '../../environments/environment';
|
|
|
|
|
|
2026-03-24 00:09:11 +04:00
|
|
|
/** Map internal language codes to API header values */
|
|
|
|
|
const LANG_HEADER_MAP: Record<string, string> = {
|
|
|
|
|
'ru': 'RU',
|
|
|
|
|
'en': 'EN',
|
|
|
|
|
'hy': 'AM',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/** Map region IDs to API header values */
|
|
|
|
|
const REGION_HEADER_MAP: Record<string, string> = {
|
|
|
|
|
'moscow': 'Moscow',
|
|
|
|
|
'spb': 'ST. Petersburg',
|
|
|
|
|
'yerevan': 'Yerevan',
|
|
|
|
|
};
|
|
|
|
|
|
2026-04-14 13:49:54 +04:00
|
|
|
const SESSION_STORAGE_KEY = 'web_session_id';
|
|
|
|
|
|
|
|
|
|
/** Generate a 32-char hex string (GUID without dashes) */
|
|
|
|
|
function generateSessionId(): string {
|
|
|
|
|
const bytes = new Uint8Array(16);
|
|
|
|
|
crypto.getRandomValues(bytes);
|
|
|
|
|
return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Get or create a persistent anonymous session ID */
|
|
|
|
|
function getAnonymousSessionId(): string {
|
|
|
|
|
let id = localStorage.getItem(SESSION_STORAGE_KEY);
|
|
|
|
|
if (!id || id.length !== 32) {
|
|
|
|
|
id = generateSessionId();
|
|
|
|
|
localStorage.setItem(SESSION_STORAGE_KEY, id);
|
|
|
|
|
}
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-28 17:42:36 +04:00
|
|
|
export const apiHeadersInterceptor: HttpInterceptorFn = (req, next) => {
|
|
|
|
|
if (!req.url.startsWith(environment.apiUrl)) {
|
|
|
|
|
return next(req);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const locationService = inject(LocationService);
|
|
|
|
|
const languageService = inject(LanguageService);
|
2026-03-24 00:09:11 +04:00
|
|
|
const authService = inject(AuthService);
|
2026-02-28 17:42:36 +04:00
|
|
|
|
2026-03-24 00:09:11 +04:00
|
|
|
const regionId = locationService.regionId();
|
|
|
|
|
const lang = languageService.currentLanguage();
|
|
|
|
|
const currency = languageService.currentCurrency();
|
|
|
|
|
const session = authService.session();
|
2026-02-28 17:42:36 +04:00
|
|
|
|
|
|
|
|
let headers = req.headers;
|
|
|
|
|
|
|
|
|
|
if (regionId) {
|
2026-03-24 00:09:11 +04:00
|
|
|
headers = headers.set('X-Region', REGION_HEADER_MAP[regionId] ?? regionId);
|
2026-02-28 17:42:36 +04:00
|
|
|
}
|
|
|
|
|
if (lang) {
|
2026-03-24 00:09:11 +04:00
|
|
|
headers = headers.set('X-Language', LANG_HEADER_MAP[lang] ?? lang.toUpperCase());
|
|
|
|
|
}
|
|
|
|
|
headers = headers.set('Currency', currency || 'RUB');
|
2026-04-14 13:49:54 +04:00
|
|
|
headers = headers.set('WebSessionID', session?.sessionId || getAnonymousSessionId());
|
2026-02-28 17:42:36 +04:00
|
|
|
|
|
|
|
|
return next(req.clone({ headers }));
|
|
|
|
|
};
|