⚙️ Attribute Handler
Attribute handlers provide core business logic functions for attribute group management operations in Nodeblocks applications. These handlers encapsulate common patterns for database operations, data transformation, and response formatting.
🎯 Overview
Attribute handlers are designed to:
- Encapsulate attribute group business logic in reusable functions
- Handle database operations with proper error management
- Transform attribute data between different formats
- Ensure type safety with TypeScript integration
- Support composition with other blocks
📋 Attribute Handler Types
Attribute Async Handlers
Functions that perform asynchronous attribute operations (database calls, API requests, etc.).
Attribute Sync Handlers
Functions that perform synchronous attribute operations (data transformation, validation, etc.).
Attribute Terminator Handlers
Functions that format and return the final attribute response.
🔧 Available Attribute Handlers
createAttributeGroup
Creates a new attribute group in the database.
Purpose: Handles creation of attribute groups with validation and entity management
Parameters:
payload:RouteHandlerPayload- Contains request context and dataparams.requestBody: Attribute group creation datacontext.db: Database connection
Returns: Result<RouteHandlerPayload, Error> - Success with attributeId or error
Payload Requirements:
params.requestBodymust contain attribute group datacontext.dbmust be available for database operations
Key Features:
- Validates request body is present and not empty
- Creates base entity with timestamps and ID
- Inserts attribute group into database
- Returns attributeId on success
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { createAttributeGroup } = handlers;
// Use in composition
const attributePipeline = compose(createAttributeGroup, getAttributeGroupById, createAttributeGroupTerminator);
updateAttributeGroup
Updates an existing attribute group by ID.
Purpose: Handles updating attribute groups with validation and conflict detection
Parameters:
payload:RouteHandlerPayload- Contains request context and dataparams.requestParams.attributeIdorcontext.data.attributeId: Attribute ID to updateparams.requestBody: Attribute group data to updatecontext.db: Database connection
Returns: Result<RouteHandlerPayload, Error> - Success with attributeId or error
Payload Requirements:
- Attribute ID must be provided in
params.requestParams.attributeIdorcontext.data.attributeId params.requestBodymust contain attribute group data to updatecontext.dbmust be available for database operations
Key Features:
- Validates attributeId is provided
- Validates request body is present and not empty
- Updates base entity with timestamps
- Checks if attribute group exists before updating
- Returns attributeId on success
- Handles not found and update failures
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { updateAttributeGroup } = handlers;
// Use in composition
const attributePipeline = compose(updateAttributeGroup, getAttributeGroupById, normalizeAttributeGroupTerminator);
getAttributeGroupById
Retrieves a single attribute group by ID.
Purpose: Fetches attribute group data with existence validation
Parameters:
payload:RouteHandlerPayload- Contains request context and dataparams.requestParams.attributeIdorcontext.data.attributeId: Attribute ID to retrievecontext.db: Database connection
Returns: Result<RouteHandlerPayload, Error> - Success with attributeGroup or error
Payload Requirements:
- Attribute ID must be provided in
params.requestParams.attributeIdorcontext.data.attributeId context.dbmust be available for database operations
Key Features:
- Validates attributeId is provided
- Finds attribute group by ID in database
- Returns 404 if attribute group not found
- Returns attributeGroup data on success
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { getAttributeGroupById } = handlers;
// Use in composition
const attributePipeline = compose(getAttributeGroupById, normalizeAttributeGroupTerminator);
findAttributeGroups
Finds multiple attribute groups with optional filtering.
Purpose: Handles querying attribute groups with filter support
Parameters:
payload:RouteHandlerPayload- Contains request context and dataparams.requestQuery: Optional filter criteria for attribute groupscontext.db: Database connection
Returns: Result<RouteHandlerPayload, Error> - Success with attributeGroups array or error
Payload Requirements:
params.requestQueryis optional - if provided, used as MongoDB filtercontext.dbmust be available for database operations
Key Features:
- Accepts optional filter from request query
- Returns all attribute groups if no filter provided
- Returns array of attributeGroups
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { findAttributeGroups } = handlers;
// Use in composition
const attributePipeline = compose(findAttributeGroups, normalizeAttributesListTerminator);
deleteAttributeGroup
Deletes an attribute group by ID.
Purpose: Handles safe deletion of attribute groups with existence validation
Parameters:
payload:RouteHandlerPayload- Contains request context and dataparams.requestParams.attributeIdorcontext.data.attributeId: Attribute ID to deletecontext.db: Database connection
Returns: Result<RouteHandlerPayload, Error> - Success with deletion flag or error
Payload Requirements:
- Attribute ID must be provided in
params.requestParams.attributeIdorcontext.data.attributeId context.dbmust be available for database operations
Key Features:
- Validates attributeId is provided
- Deletes attribute group by ID from database
- Returns 404 if attribute group not found
- Returns deletion confirmation flag
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteAttributeGroup } = handlers;
// Use in composition
const attributePipeline = compose(deleteAttributeGroup, deleteAttributeTerminator);
🎯 Attribute Terminator Handlers
createAttributeGroupTerminator
Terminates attribute group creation with proper response formatting.
Purpose: Formats successful attribute group creation response with 201 status
Parameters:
result:Result<RouteHandlerPayload, Error>- Result containing payload or errorcontext.data.attributeGroup: Attribute group object from previous handler
Returns: Formatted response object with data and statusCode
Payload Requirements:
context.data.attributeGroupmust be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { createAttributeGroupTerminator } = handlers;
// Use in composition
const attributePipeline = compose(createAttributeGroup, getAttributeGroupById, createAttributeGroupTerminator);
normalizeAttributeGroupTerminator
Normalizes attribute group data by removing database-specific fields.
Purpose: Cleans attribute group data for API response
Parameters:
result:Result<RouteHandlerPayload, Error>- Result containing payload or errorcontext.data.attributeGroup: Attribute group object from previous handler
Returns: Normalized attribute group object
Payload Requirements:
context.data.attributeGroupmust be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { normalizeAttributeGroupTerminator } = handlers;
// Use in composition
const attributePipeline = compose(getAttributeGroupById, normalizeAttributeGroupTerminator);
normalizeAttributesListTerminator
Normalizes attribute groups list by removing database-specific fields from each item.
Purpose: Cleans attribute groups array data for API response
Parameters:
result:Result<RouteHandlerPayload, Error>- Result containing payload or errorcontext.data.attributeGroups: Array of attribute group objects from previous handler
Returns: Array of normalized attribute group objects
Payload Requirements:
context.data.attributeGroupsmust be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { normalizeAttributesListTerminator } = handlers;
// Use in composition
const attributePipeline = compose(findAttributeGroups, normalizeAttributesListTerminator);
deleteAttributeTerminator
Terminates attribute group deletion with proper status code.
Purpose: Formats successful deletion response with 204 status
Parameters:
result:Result<RouteHandlerPayload, Error>- Result containing payload or errorcontext.data.attributeGroupDeleted: Deletion flag from previous handler
Returns: Response object with 204 statusCode
Payload Requirements:
context.data.attributeGroupDeletedmust be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteAttributeTerminator } = handlers;
// Use in composition
const attributePipeline = compose(deleteAttributeGroup, deleteAttributeTerminator);