📧 Invitation Handler Blocks
Invitation handler blocks provide core business logic functions for invitation management operations in Nodeblocks applications. These handlers encapsulate common patterns for invitation database operations, data transformation, and response formatting.
🎯 Overview
Invitation handler blocks are designed to:
- Encapsulate invitation business logic in reusable functions
- Handle invitation database operations with proper error management
- Transform invitation data between different formats
- Ensure type safety with TypeScript integration
- Support composition with other invitation blocks
📋 Invitation Handler Types
Invitation Async Handlers
Functions that perform asynchronous invitation operations (database calls, API requests, etc.).
Invitation Sync Handlers
Functions that perform synchronous invitation operations (data transformation, validation, etc.).
Invitation Terminator Handlers
Functions that format and return the final invitation response.
🔧 Available Invitation Handlers
createInvitation
Creates a new invitation in the database.
Purpose: Handles creation of invitations with entity management
Parameters:
payload
:RouteHandlerPayload
- Contains request context and dataparams.requestBody
: Invitation creation datacontext.db
: Database connectioncontext.configuration.invitation.status.pending
: Pending status configuration
Returns: Result<RouteHandlerPayload, Error>
- Success with invitationId or error
Payload Requirements:
params.requestBody
must contain invitation datacontext.db
must be available for database operationscontext.configuration.invitation.status.pending
should be configured
Key Features:
- Validates request body is present and not empty
- Uses configuration for pending status or defaults to 'pending'
- Creates base entity with timestamps and ID
- Inserts invitation into database
- Returns invitationId on success
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { createInvitation } = handlers;
// Use in composition
const invitationPipeline = compose(createInvitation, generateToken, sendEmail);
sendInvitationEmail
Sends invitation email with one-time token.
Purpose: Handles email delivery for invitation notifications
Parameters:
payload
:RouteHandlerPayload
- Contains request context and datacontext.data.invitation
: Invitation object from previous handlercontext.data.token
: One-time token from previous handlercontext.mailService
: Mail service for sending emailscontext.configuration.invitation.emailConfig
: Email configurationcontext.configuration.invitation.enabled
: Whether invitations are enabled
Returns: Result<RouteHandlerPayload, Error>
- Success with invitationEmailSent flag or error
Payload Requirements:
context.data.invitation
andtoken
must be available from previous handlerscontext.mailService
must be available for email sendingcontext.configuration.invitation
must be enabled and properly configured
Key Features:
- Validates invitation and token are provided
- Checks invitation email configuration is complete and enabled
- Validates mail service is available
- Generates email HTML using template and token
- Sends invitation email using mail service
- Returns email sending result on success
- Handles configuration and email sending errors
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { sendInvitationEmail } = handlers;
// Use in composition
const invitationPipeline = compose(generateToken, sendInvitationEmail, terminator);
findInvitations
Finds multiple invitations with optional filtering.
Purpose: Handles querying invitations with filter support
Parameters:
payload
:RouteHandlerPayload
- Contains request context and dataparams.requestQuery
: Optional filter criteria for invitationscontext.db
: Database connection
Returns: Result<RouteHandlerPayload, Error>
- Success with invitations 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 invitations if no filter provided
- Returns array of invitations
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { findInvitations } = handlers;
// Use in composition
const invitationPipeline = compose(findInvitations, listTerminator);
buildCheckInvitationTokenPayload
Builds payload for invitation token validation with target specification.
Purpose: Configures token validation for invitation workflow
Parameters:
payload
:RouteHandlerPayload
- Contains request context and data
Returns: Result<RouteHandlerPayload, Error>
- Success with checkToken configuration
Payload Requirements:
- No specific requirements - this handler always succeeds
Key Features:
- Merges checkToken configuration with invitation target
- Sets target to INVITATION_TARGET constant
- Always succeeds (no error conditions)
- Returns updated payload with checkToken configuration
- Used as preparation step for invitation token validation
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { buildCheckInvitationTokenPayload } = handlers;
// Use in composition
const invitationPipeline = compose(buildCheckInvitationTokenPayload, checkToken);
buildInvitationOnetimeTokenPayload
Builds a payload for generating invitation one-time tokens.
Purpose: Prepares invitation-specific data and request information for the generateOnetimeToken handler
Parameters:
payload
:RouteHandlerPayload
- Contains request context and datacontext.data.invitationId
: Invitation ID from previous handlercontext.configuration.invitation.target
: Invitation target configuration
Returns: Result<RouteHandlerPayload, Error>
- Success with token payload data or error
Payload Requirements:
context.data.invitationId
must be available from previous handlercontext.configuration.invitation.target
should be configured
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { buildInvitationOnetimeTokenPayload } = handlers;
// Use in composition
const invitationPipeline = compose(createInvitation, buildInvitationOnetimeTokenPayload, generateOnetimeToken, sendEmail);
getInvitationIdFromTokenInfo
Extracts invitation ID from token information in request context.
Purpose: Extracts invitationId from token data for invitation processing
Parameters:
payload
:RouteHandlerPayload
- Contains request context and datacontext.data.tokenInfo.invitationId
: Invitation ID from token
Returns: Result<RouteHandlerPayload, Error>
- Success with invitationId or error
Payload Requirements:
context.data.tokenInfo.invitationId
must be available from previous handler
Key Features:
- Extracts invitationId from token info in context
- Validates invitationId is provided
- Returns invitationId on success
- Returns 400 error if invitationId is missing
- Used as preparation step for invitation processing
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { getInvitationIdFromTokenInfo } = handlers;
// Use in composition
const invitationPipeline = compose(getInvitationIdFromTokenInfo, getInvitationById, isPendingInvitation);
getInvitationById
Retrieves a single invitation by its unique identifier.
Purpose: Fetches invitation details from database using invitation ID
Parameters:
payload
:RouteHandlerPayload
- Contains request context and dataparams.requestParams.invitationId
orcontext.data.invitationId
: Invitation ID to retrievecontext.db
: Database connection
Returns: Result<RouteHandlerPayload, Error>
- Success with invitation object or error
Payload Requirements:
- Invitation ID must be provided in
params.requestParams.invitationId
orcontext.data.invitationId
context.db
must be available for database operations
Key Features:
- Validates invitationId is provided
- Finds invitation by ID in database
- Returns 404 if invitation not found
- Returns invitation data on success
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { getInvitationById } = handlers;
// Use in composition
const invitationPipeline = compose(getInvitationById, isPendingInvitation, updateInvitation);
verifyInvitationPayload
Verifies invitation authenticity using token information.
Purpose: Validates invitation ID against token information for security
Parameters:
payload
:RouteHandlerPayload
- Contains request context and dataparams.requestParams.invitationId
orcontext.data.invitationId
: Invitation ID to verifycontext.data.tokenInfo.invitationId
: Invitation ID from token
Returns: Result<RouteHandlerPayload, Error>
- Success with verified invitationId or error
Payload Requirements:
- Invitation ID must be provided in params or context data
context.data.tokenInfo.invitationId
must be available from previous handler- Both IDs must match for verification to succeed
Key Features:
- Extracts invitationId from multiple sources
- Validates tokenInfo contains invitationId
- Compares invitationId with token invitationId for security
- Returns verification flag on success
- Returns 400 error if IDs don't match
- Ensures invitation authenticity
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { verifyInvitationPayload } = handlers;
// Use in composition
const invitationPipeline = compose(verifyInvitationPayload, getInvitationById, isPendingInvitation);
isPendingInvitation
Validates that an invitation is in pending status.
Purpose: Ensures invitation can be processed by checking its status
Parameters:
payload
:RouteHandlerPayload
- Contains request context and datacontext.data.invitation
: Invitation object from previous handlercontext.configuration.invitation.status.pending
: Pending status configuration
Returns: Result<RouteHandlerPayload, Error>
- Success with isPendingInvitation flag or error
Payload Requirements:
context.data.invitation
must be available from previous handlercontext.configuration.invitation.status.pending
should be configured
Key Features:
- Validates invitation is provided in context
- Uses configuration for pending status or defaults to 'pending'
- Checks invitation status matches pending status
- Returns pending flag on success
- Returns 400 error if invitation is not pending
- Ensures invitation can be processed
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { isPendingInvitation } = handlers;
// Use in composition
const invitationPipeline = compose(getInvitationById, isPendingInvitation, buildAcceptInvitationPayload);
buildAcceptInvitationPayload
Builds payload for accepting an invitation with updated status and timestamp.
Purpose: Prepares invitation data with accepted status and acceptance timestamp
Parameters:
payload
:RouteHandlerPayload
- Contains request context and datacontext.configuration.invitation.status.accepted
: Accepted status configuration
Returns: Result<RouteHandlerPayload, Error>
- Success with updated invitation data or error
Payload Requirements:
context.configuration.invitation.status.accepted
should be configured
Key Features:
- Uses configuration for accepted status or defaults to 'accepted'
- Updates base entity with timestamps
- Sets acceptedAt timestamp to current date
- Sets status to accepted
- Returns updated invitation data on success
- Prepares invitation for acceptance workflow
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { buildAcceptInvitationPayload } = handlers;
// Use in composition
const invitationPipeline = compose(getInvitationById, isPendingInvitation, buildAcceptInvitationPayload, updateInvitation);
updateInvitation
Updates invitation data in the database with validation and error handling.
Purpose: Updates invitation records with proper validation
Parameters:
payload
:RouteHandlerPayload
- Contains request context and dataparams.requestParams.invitationId
orcontext.data.invitationId
: Invitation ID to updateparams.requestBody
orcontext.data.invitation
: Invitation data to updatecontext.db
: Database connection
Returns: Result<RouteHandlerPayload, Error>
- Success with invitationId or error
Payload Requirements:
- Invitation ID must be provided in params or context data
- Invitation data must be provided in request body or context data
context.db
must be available for database operations
Key Features:
- Validates invitationId is provided
- Validates invitation data is present and not empty
- Updates base entity with timestamps
- Checks if invitation exists before updating
- Returns invitationId on success
- Handles not found and update failures
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { updateInvitation } = handlers;
// Use in composition
const invitationPipeline = compose(getInvitationById, isPendingInvitation, buildAcceptInvitationPayload, updateInvitation);
deleteInvitation
Removes an invitation from the database by its unique identifier.
Purpose: Permanently deletes invitation records with validation
Parameters:
payload
:RouteHandlerPayload
- Contains request context and dataparams.requestParams.invitationId
orcontext.data.invitationId
: Invitation ID to deletecontext.db
: Database connection
Returns: Result<RouteHandlerPayload, Error>
- Success with invitationId or error
Payload Requirements:
- Invitation ID must be provided in
params.requestParams.invitationId
orcontext.data.invitationId
context.db
must be available for database operations
Key Features:
- Validates invitationId is provided
- Deletes invitation by ID from database
- Returns 404 if invitation not found
- Returns deletion result on success
- Handles database errors gracefully
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteInvitation } = handlers;
// Use in composition
const invitationPipeline = compose(getInvitationById, deleteInvitation, deleteTerminator);
🎯 Invitation Terminator Handlers
createInvitationTerminator
Terminates invitation creation with proper status code.
Purpose: Formats successful invitation creation response with 201 status
Parameters:
result
:Result<RouteHandlerPayload, Error>
- Result containing payload or errorcontext.data.createInvitation
: Creation result from previous handler
Returns: Response object with 201 statusCode
Payload Requirements:
context.data.createInvitation
must be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { createInvitationTerminator } = handlers;
// Use in composition
const invitationPipeline = compose(createInvitation, createInvitationTerminator);
normalizeInvitationTerminator
Normalizes invitation data by removing database-specific fields.
Purpose: Cleans invitation data for API response
Parameters:
result
:Result<RouteHandlerPayload, Error>
- Result containing payload or errorcontext.data.invitation
: Invitation object from previous handler
Returns: Normalized invitation object
Payload Requirements:
context.data.invitation
must be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { normalizeInvitationTerminator } = handlers;
// Use in composition
const invitationPipeline = compose(getInvitationById, normalizeInvitationTerminator);
normalizeInvitationsListTerminator
Normalizes invitations list by removing database-specific fields from each item.
Purpose: Cleans invitations array data for API response
Parameters:
result
:Result<RouteHandlerPayload, Error>
- Result containing payload or errorcontext.data.invitations
: Array of invitation objects from previous handler
Returns: Array of normalized invitation objects
Payload Requirements:
context.data.invitations
must be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { normalizeInvitationsListTerminator } = handlers;
// Use in composition
const invitationPipeline = compose(findInvitations, normalizeInvitationsListTerminator);
deleteInvitationTerminator
Terminates invitation deletion with proper status code.
Purpose: Formats successful deletion response with 204 status
Parameters:
result
:Result<RouteHandlerPayload, Error>
- Result containing payload or errorcontext.data.deleteInvitation
: Deletion result from previous handler
Returns: Response object with 204 statusCode
Payload Requirements:
context.data.deleteInvitation
must be available from previous handler
Usage:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteInvitationTerminator } = handlers;
// Use in composition
const invitationPipeline = compose(deleteInvitation, deleteInvitationTerminator);