feat(catalog): adopt subject-aware availability contract

This commit is contained in:
2026-08-24 15:16:00 -03:00
parent eda8d32f4e
commit f02f4456b7
3 changed files with 11 additions and 3 deletions

View File

@@ -1,9 +1,11 @@
import { CatalogAvailability } from './catalog.interface'; import { CatalogAvailability } from './catalog.interface';
export const AVAILABLE_CATALOG_AVAILABILITY: CatalogAvailability = { export const AVAILABLE_CATALOG_AVAILABILITY: CatalogAvailability = {
subject: 'product',
maximum_quantity: null, maximum_quantity: null,
restrictions: [], restrictions: [],
capabilities: { capabilities: {
display: true,
select_variant: true, select_variant: true,
change_quantity: true, change_quantity: true,
add_to_cart: true, add_to_cart: true,
@@ -11,21 +13,25 @@ export const AVAILABLE_CATALOG_AVAILABILITY: CatalogAvailability = {
}, },
}; };
export function createCatalogAvailability(maximumQuantity: number | null): CatalogAvailability { export function createCatalogAvailability(
maximumQuantity: number | null,
subject: CatalogAvailability['subject'] = 'product',
): CatalogAvailability {
const unavailable = maximumQuantity === 0; const unavailable = maximumQuantity === 0;
return { return {
subject,
maximum_quantity: maximumQuantity, maximum_quantity: maximumQuantity,
restrictions: unavailable restrictions: unavailable
? [ ? [
{ {
code: 'out_of_stock', code: 'out_of_stock',
message: 'Este producto no tiene stock disponible.', message: 'Este producto no tiene stock disponible.',
scope: 'product',
}, },
] ]
: [], : [],
capabilities: { capabilities: {
display: !unavailable,
select_variant: !unavailable, select_variant: !unavailable,
change_quantity: !unavailable, change_quantity: !unavailable,
add_to_cart: !unavailable, add_to_cart: !unavailable,

View File

@@ -52,10 +52,10 @@ export type InventoryPolicy = 'tracked' | 'unlimited';
export interface CatalogRestriction { export interface CatalogRestriction {
code: 'out_of_stock' | 'user_quota_reached' | string; code: 'out_of_stock' | 'user_quota_reached' | string;
message: string; message: string;
scope: 'product' | 'variant' | string;
} }
export interface CatalogCapabilities { export interface CatalogCapabilities {
display: boolean;
select_variant: boolean; select_variant: boolean;
change_quantity: boolean; change_quantity: boolean;
add_to_cart: boolean; add_to_cart: boolean;
@@ -63,6 +63,7 @@ export interface CatalogCapabilities {
} }
export interface CatalogAvailability { export interface CatalogAvailability {
subject: 'product' | 'variant';
maximum_quantity: number | null; maximum_quantity: number | null;
restrictions: CatalogRestriction[]; restrictions: CatalogRestriction[];
capabilities: CatalogCapabilities; capabilities: CatalogCapabilities;

View File

@@ -24,6 +24,7 @@ export interface VariantSelectorVariant {
values: Record<string, VariantAttributeValue>; values: Record<string, VariantAttributeValue>;
availability?: { availability?: {
capabilities: { capabilities: {
display: boolean;
select_variant: boolean; select_variant: boolean;
}; };
}; };