TorbatYar/frontend/modules/commercial/adapters/tenant-recommendations.ts
2026-07-28 20:39:10 +03:30

49 lines
1.9 KiB
TypeScript

import type { AdapterResult } from "../types";
import { commercialGet, failResult } from "./http";
export interface TenantRecommendationFeed {
recommended_products: Array<{ code: string; score?: number; reason?: string }>;
recommended_bundles: Array<{ code: string; score?: number; reason?: string }>;
recommended_services?: Array<{ code: string; score?: number; reason?: string }>;
recommended_upgrades?: Array<{ code: string; score?: number; reason?: string }>;
recommended_automation_packs?: Array<{ code: string; score?: number; reason?: string }>;
recommended_extensions?: Array<{ code: string; score?: number; reason?: string }>;
rule_trace?: string[];
}
const EMPTY: TenantRecommendationFeed = {
recommended_products: [],
recommended_bundles: [],
recommended_services: [],
recommended_upgrades: [],
recommended_automation_packs: [],
recommended_extensions: [],
};
/** Tenant recommendation feed — never invents suggestions. */
export async function loadTenantRecommendations(
tenantId: string
): Promise<AdapterResult<TenantRecommendationFeed>> {
const res = await commercialGet<TenantRecommendationFeed>(
`/api/v1/commercial/recommendations/tenant?tenant_id=${encodeURIComponent(tenantId)}`
);
if (!res.ok) {
return failResult(res.availability, res.message || "پیشنهادها در دسترس نیست", EMPTY);
}
const data = { ...EMPTY, ...res.data };
const hasAny =
data.recommended_products.length +
data.recommended_bundles.length +
(data.recommended_services?.length || 0) +
(data.recommended_upgrades?.length || 0) +
(data.recommended_automation_packs?.length || 0) +
(data.recommended_extensions?.length || 0) >
0;
return {
availability: hasAny ? "ready" : "empty",
data,
source: "commercial.recommendations.tenant",
message: hasAny ? undefined : "پیشنهادی ثبت نشده",
};
}