⚙️ Attribute Handler Blocks
Attribute handler blocks 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 handler blocks 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.requestBody
must contain attribute group datacontext.db
must 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.attributeId
orcontext.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.attributeId
orcontext.data.attributeId
params.requestBody
must contain attribute group data to updatecontext.db
must 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.attributeId
orcontext.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.attributeId
orcontext.data.attributeId
context.db
must 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.requestQuery
is optional - if provided, used as MongoDB filtercontext.db
must 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.attributeId
orcontext.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.attributeId
orcontext.data.attributeId
context.db
must 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.attributeGroup
must 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.attributeGroup
must 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.attributeGroups
must 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.attributeGroupDeleted
must be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteAttributeTerminator } = handlers;
// Use in composition
const attributePipeline = compose(deleteAttributeGroup, deleteAttributeTerminator);