Products and Offers
This documentation provides a comprehensive overview of the Product management system within the Nuxt 3 e-commerce B2B application. The system consists of two main composables: useProduct and useProductVariant that handle product data retrieval, manipulation, and related operations.
System Architecture
The Product system is built around two complementary composables that work together to provide complete product management functionality:
graph TB
subgraph "Product Management Architecture"
User[User Interface]
subgraph "Composables Layer"
UP[useProduct]
UPV[useProductVariant]
end
subgraph "useProduct Structure"
UPA[useProductApi]
UPG[useProductGetters]
UPH[useProductHelpers]
end
subgraph "useProductVariant Structure"
UPVA[useProductVariantApi]
UPVG[useProductVariantGetters]
UPVH[useProductVariantHelpers]
end
subgraph "Backend Integration"
SDK[Djust SDK]
API[API Routes]
end
end
User --> UP
User --> UPV
UP --> UPA
UP --> UPG
UP --> UPH
UPV --> UPVA
UPV --> UPVG
UPV --> UPVH
UPA --> SDK
UPVA --> SDK
SDK --> API
style UP fill:#e1f5fe
style UPV fill:#f3e5f5
style SDK fill:#e8f5e8
Data Structure Overview
The Product system manages several key data types and their relationships:
| Entity | Description | Key Properties | Source |
|---|---|---|---|
| Product | Main product entity | id, sku, name, description, brand | SDK ProductModel |
| ProductVariant | Product variations | skuVariant, attributeValues, status | Custom Interface |
| ProductThumbnail | Compact product view | sku, name, mainPictureUrl | SDK Model |
| ProductAttributeValue | Product attributes | attribute, value, type | SDK AttributeValue |
| ProductMediaInfo | Media assets | urls, isMain, type | SDK MediaInfoDTO |
Core Functionality
Product Operations Flow
sequenceDiagram
participant U as User
participant C as Component
participant UP as useProduct
participant SDK as Djust SDK
participant API as API Server
U->>C: Request Product Details
C->>UP: getProductbyId(params)
UP->>SDK: useFetch('/api/product/{id}')
SDK->>API: GET /api/product/{productId}
API-->>SDK: Product Data
SDK-->>UP: GetProductResponse
UP->>UP: Process Response
UP-->>C: Formatted Product
C-->>U: Display Product
Note over UP,SDK: Error handling at each step
Note over API: Authentication & validation
Product Variant Operations Flow
sequenceDiagram
participant U as User
participant C as Component
participant UPV as useProductVariant
participant UP as useProduct
participant SDK as Djust SDK
U->>C: Request Variant Details
C->>UPV: getProductVariantId(variant)
UPV->>UPV: Extract ID from variant
UPV-->>C: Variant ID
alt Get Full Variant Data
C->>UP: getProductVariants(params)
UP->>SDK: API Call
SDK-->>UP: Variants List
UP-->>C: Variant Details
end
C-->>U: Display Variant Info
Authentication Overview
The Product system operates in both authenticated and unauthenticated modes, providing different levels of data access based on the user's authentication status. All product API endpoints are accessible without authentication, but return filtered public data for unauthenticated users and complete data for authenticated users.
Authentication Flow
Product Access Authentication Flow
sequenceDiagram
participant User as User
participant Component as Vue Component
participant Product as useProduct
participant API as Product API
participant AuthService as Auth Service
User->>Component: Request Product Data
Component->>Product: getProductbyId(params)
Product->>API: API Request (with optional auth token)
API->>AuthService: Check Authentication Token (if present)
alt Authenticated User
AuthService-->>API: Valid Token & Permissions
API-->>Product: Complete Product Data (all offers, pricing, stock)
Product-->>Component: Full Product Information
Component-->>User: Display Complete Product
else Unauthenticated User
AuthService-->>API: No Token or Invalid Token
API-->>Product: Public Product Data (public offers only)
Product-->>Component: Limited Product Information
Component-->>User: Display Public Product Data
end
Note over API: Server filters data based on authentication status
Note over API: Same response format in both cases
Data Filtering Based on Authentication
Public vs Authenticated Data Access
The Product system provides different levels of data access based on authentication status:
| API Function | Unauthenticated Access | Authenticated Access |
|---|---|---|
getProductbyId | Public products only | All products including private/restricted |
getProductVariants | Public variants only | All variants with full specifications |
getProductPaginatedOffers | Public offers only | All offers including exclusive pricing |
getProductVariantOffers | Public offers only | All offers including supplier-specific pricing |
Main Features
1. Product Data Retrieval
The system provides comprehensive product data access through specialized getter functions:
- Basic Information: Name, description, SKU, brand, external identifiers
- Media Management: Main images, product pictures, media URLs
- Attribute Processing: Product attributes with type-specific value extraction
- Status Management: Product status, availability, and lifecycle state
2. Product Variant Management
Product variants are handled through dedicated functionality:
- Variant Identification: Unique IDs, SKUs, external identifiers
- Attribute Values: Type-aware attribute value extraction (LIST_TEXT, METRIC, COLOR)
- Media Assets: Variant-specific images and media information
- Offer Integration: Seamless integration with pricing offers
3. API Integration
The system integrates with multiple backend endpoints:
- Product Details:
/api/product/{productId}- Get detailed product information - Related Products:
/api/product/{productId}/related-products- Fetch related items - Product Offers:
/api/product/{productId}/offers- Get product pricing offers - Product Variants:
/api/product-variants/{productSku}- List product variations - Variant Offers:
/api/product-variants/{productVariantId}/offers- Variant pricing - Product Reviews:
/api/product/{productId}/reviews- Review management
Key Points
Performance Considerations
- Lazy Loading: Product data is fetched on-demand to optimize initial load times
- Pagination Support: Large product lists and offers support pagination
- Caching Strategy: Leverages Nuxt's built-in caching for repeated requests
- Image Optimization: Media URLs are processed for optimal delivery
Security & Authentication
- JWT Integration: All API calls include authentication headers
- Permission Validation: Backend validates user permissions for product access
- Data Sanitization: User inputs are validated before API calls
- Error Boundary: Comprehensive error handling prevents data exposure
Flexibility & Configuration
- Multi-locale Support: Products support internationalization through locale parameters
- Currency Handling: Product pricing adapts to user's currency settings
- Customizable Pagination: Configurable page sizes and navigation
- Attribute Type Support: Handles various attribute types (text, metric, color, list)
Integration Capabilities
- SDK Abstraction: Clean separation between frontend logic and backend communication
- Type Safety: Full TypeScript support with SDK-generated interfaces
- Composable Architecture: Modular structure allows selective feature usage
- Error Propagation: Consistent error handling across all product operations
Best Practices
Composable Usage
When working with the Product system, follow these recommended patterns:
// ✅ Correct: Use destructuring for specific functionality
const { getProductbyId, getProductName, getProductStatus } = useProduct();
const { getProductVariantId, getProductVariantAttributeValues } =
useProductVariant();
// ✅ Correct: Handle loading states
const isLoading = ref(false);
const product = ref(null);
const fetchProduct = async (productId: string) => {
isLoading.value = true;
try {
const response = await getProductbyId({ productIdentifier: productId });
product.value = response.product;
} catch (error) {
console.error("Failed to fetch product:", error);
} finally {
isLoading.value = false;
}
};Error Handling
Implement comprehensive error handling for robust applications:
// ✅ Correct: Comprehensive error handling
try {
const productResponse = await getProductbyId(params);
if (!productResponse.success || !productResponse.product) {
throw new Error("Product not found");
}
return productResponse.product;
} catch (error) {
// Log error for debugging
console.error("Product fetch failed:", error);
// Show user-friendly message
useToast().add({
title: "Error",
description: "Unable to load product details. Please try again.",
color: "red",
});
return null;
}Performance Optimization
Optimize product data handling for better user experience:
// ✅ Correct: Optimize image loading
const getOptimizedProductImages = (product: Product) => {
const pictures = getProductPictures(product);
return pictures
?.filter((pic) => pic.urls?.length > 0)
.map((pic) => pic.urls[0]) // Use first URL for optimization
.slice(0, 5); // Limit to 5 images
};
// ✅ Correct: Implement proper pagination
const loadProducts = async (page: number = 0, size: number = 20) => {
return await getProductPaginatedOffers({
productIdentifier: productId,
pageable: { page, size },
});
};Detailed Documentation
This overview provides the foundation for understanding the Product management system. For detailed implementation guides, API specifications, and advanced usage patterns, refer to the following specialized documentation:
Function Documentation
- Get Product by ID - Retrieve detailed product information
- Get Product Variants - List product variants with pagination
- Get Product Paginated Offers - Retrieve product pricing and supplier offers
- Get Product Variant Offers - Get variant-specific pricing and availability
System Documentation
- Types & Interfaces - Complete TypeScript interface definitions
- Error Handling - Comprehensive error management strategies
- Authentication Integration - Product system authentication requirements
The Product system serves as a critical foundation for the e-commerce platform, providing reliable, performant, and secure access to product data across the entire application ecosystem.
Updated 3 months ago
