⚙️ 属性ハンドラー
属性ハンドラーは、Nodeblocksアプリケーションで属性グループ管理操作のコアビジネスロジック関数を提供します。これらのハンドラーは、データベース操作、データ変換、レスポンスフォーマットの一般的なパターンをカプセル化します。
🎯 概要
属性ハンドラーは以下の目的で設計されています:
- 属性グループのビジネスロジックをカプセル化 - 再利用可能な関数として実装
- データベース操作の処理 - 適切なエラー管理を含む
- 属性データの変換 - 異なるフォーマット間での変換
- 型安全性の確保 - TypeScript統合による型安全性
- 他のブロックとの合成をサポート - コンポジションパターンの対応
📋 属性ハンドラータイプ
属性非同期ハンドラー
非同期属性操作(データベース呼び出し、APIリクエストなど)を実行する関数。
属性同期ハンドラー
同期属性操作(データ変換、バリデーションなど)を実行する関数。
属性ターミネーターハンドラー
最終的な属性レスポンスをフォーマットして返す関数。
🔧 利用可能な属性ハンドラー
createAttributeGroup
データベースに新しい属性グループを作成します。
目的: バリデーションとエンティティ管理を含む属性グループの作成を処理
パラメータ:
payload:RouteHandlerPayload- リクエストコンテキストとデータを含むparams.requestBody: 属性グループ作成データcontext.db: データベース接続
戻り値: Result<RouteHandlerPayload, Error> - 成功時はattributeId、エラー時はエラー
ペイロード要件:
params.requestBodyには属性グループデータが含まれている必要がありますcontext.dbはデータベース操作で利用可能である必要があります
主な機能:
- リクエストボディが存在し、空でないことを検証
- タイムスタンプとIDを含む基本エンティティを作成
- データベースに属性グループを挿入
- 成功時にattributeIdを返す
- データベースエラーを適切に処理
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { createAttributeGroup } = handlers;
// コンポジションで使用
const attributePipeline = compose(createAttributeGroup, getAttributeGroupById, createAttributeGroupTerminator);
updateAttributeGroup
IDで既存の属性グループを更新します。
目的: バリデーションと競合検出を含む属性グループの更新を処理
パラメータ:
payload:RouteHandlerPayload- リクエストコンテキストとデータを含むparams.requestParams.attributeIdまたはcontext.data.attributeId: 更新する属性IDparams.requestBody: 更新する属性グループデータcontext.db: データベース接続
戻り値: Result<RouteHandlerPayload, Error> - 成功時はattributeId、エラー時はエラー
ペイロード要件:
- 属性IDは
params.requestParams.attributeIdまたはcontext.data.attributeIdで提供される必要があります params.requestBodyには更新する属性グループデータが含まれている必要がありますcontext.dbはデータベース操作で利用可能である必要があります
主な機能:
- attributeIdが提供されていることを検証
- リクエストボディが存在し、空でないことを検証
- タイムスタンプで基本エンティティを更新
- 更新前に属性グループが存在するかチェック
- 成功時にattributeIdを返す
- 見つからない場合と更新失敗を処理
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { updateAttributeGroup } = handlers;
// コンポジションで使用
const attributePipeline = compose(updateAttributeGroup, getAttributeGroupById, normalizeAttributeGroupTerminator);
getAttributeGroupById
IDで単一の属性グループを取得します。
目的: 存在検証を含む属性グループデータの取得
パラメータ:
payload:RouteHandlerPayload- リクエストコンテキストとデータを含むparams.requestParams.attributeIdまたはcontext.data.attributeId: 取得する属性IDcontext.db: データベース接続
戻り値: Result<RouteHandlerPayload, Error> - 成功時はattributeGroup、エラー時はエラー
ペイロード要件:
- 属性IDは
params.requestParams.attributeIdまたはcontext.data.attributeIdで提供される必要があります context.dbはデータベース操作で利用可能である必要があります
主な機能:
- attributeIdが提供されていることを検証
- データベースでIDによる属性グループを検索
- 属性グループが見つからない場合は404を返す
- 成功時にattributeGroupデータを返す
- データベースエラーを適切に処理
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { getAttributeGroupById } = handlers;
// コンポジションで使用
const attributePipeline = compose(getAttributeGroupById, normalizeAttributeGroupTerminator);
findAttributeGroups
オプションのフィルタリングで複数の属性グループを検索します。
目的: フィルタサポートを含む属性グループのクエリ処理
パラメータ:
payload:RouteHandlerPayload- リクエストコンテキストとデータを含むparams.requestQuery: 属性グループのオプションフィルタ条件context.db: データベース接続
戻り値: Result<RouteHandlerPayload, Error> - 成功時はattributeGroups配列、エラー時はエラー
ペイロード要件:
params.requestQueryはオプション - 提供された場合、MongoDBフィルタとして使用されますcontext.dbはデータベース操作で利用可能である必要があります
主な機能:
- リクエストクエリからオプションフィルタを受け入れる
- フィルタが提供されない場合はすべての属性グループを返す
- attributeGroupsの配列を返す
- データベースエラーを適切に処理
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { findAttributeGroups } = handlers;
// コンポジションで使用
const attributePipeline = compose(findAttributeGroups, normalizeAttributesListTerminator);
deleteAttributeGroup
IDで属性グループを削除します。
目的: 存在検証を含む属性グループの安全な削除を処理
パラメータ:
payload:RouteHandlerPayload- リクエストコンテキストとデータを含むparams.requestParams.attributeIdまたはcontext.data.attributeId: 削除する属性IDcontext.db: データベース接続
戻り値: Result<RouteHandlerPayload, Error> - 成功時は削除フラグ、エラー時はエラー
ペイロード要件:
- 属性IDは
params.requestParams.attributeIdまたはcontext.data.attributeIdで提供される必要があります context.dbはデータベース操作で利用可能である必要があります
主な機能:
- attributeIdが提供されていることを検証
- データベースからIDで属性グループを削除
- 属性グループが見つからない場合は404を返す
- 削除確認フラグを返す
- データベースエラーを適切に処理
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteAttributeGroup } = handlers;
// コンポジションで使用
const attributePipeline = compose(deleteAttributeGroup, deleteAttributeTerminator);
🎯 属性ターミネーターハンドラー
createAttributeGroupTerminator
適切なレスポンスフォーマットで属性グループ作成を終了します。
目的: 201ステータスで成功した属性グループ作成レスポンスをフォーマット
パラメータ:
result:Result<RouteHandlerPayload, Error>- ペイロードまたはエラーを含む結果context.data.attributeGroup: 前のハンドラーからの属性グループオブジェクト
戻り値: データとステータスコードを含むフォーマット済みレスポンスオブジェクト
ペイロード要件:
context.data.attributeGroupは前のハンドラーから利用可能である必要があります
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { createAttributeGroupTerminator } = handlers;
// コンポジションで使用
const attributePipeline = compose(createAttributeGroup, getAttributeGroupById, createAttributeGroupTerminator);
normalizeAttributeGroupTerminator
データベース固有のフィールドを削除して属性グループデータを正規化します。
目的: APIレスポンス用に属性グループデータをクリーンアップ
パラメータ:
result:Result<RouteHandlerPayload, Error>- ペイロードまたはエラーを含む結果context.data.attributeGroup: 前のハンドラーからの属性グループオブジェクト
戻り値: 正規化された属性グループオブジェクト
ペイロード要件:
context.data.attributeGroupは前のハンドラーから利用可能である必要があります
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { normalizeAttributeGroupTerminator } = handlers;
// コンポジションで使用
const attributePipeline = compose(getAttributeGroupById, normalizeAttributeGroupTerminator);
normalizeAttributesListTerminator
各項目からデータベース固有のフィールドを削除して属性グループリストを正規化します。
目的: APIレスポンス用に属性グループ配列データをクリーンアップ
パラメータ:
result:Result<RouteHandlerPayload, Error>- ペイロードまたはエラーを含む結果context.data.attributeGroups: 前のハンドラーからの属性グループオブジェクトの配列
戻り値: 正規化された属性グループオブジェクトの配列
ペイロード要件:
context.data.attributeGroupsは前のハンドラーから利用可能である必要があります
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { normalizeAttributesListTerminator } = handlers;
// コンポジションで使用
const attributePipeline = compose(findAttributeGroups, normalizeAttributesListTerminator);
deleteAttributeTerminator
適切なステータスコードで属性グループ削除を終了します。
目的: 204ステータスで成功した削除レスポンスをフォーマット
パラメータ:
result:Result<RouteHandlerPayload, Error>- ペイロードまたはエラーを含む結果context.data.attributeGroupDeleted: 前のハンドラーからの削除フラグ
戻り値: 204ステータスコードを含むレスポンスオブジェクト
ペイロード要件:
context.data.attributeGroupDeletedは前のハンドラーから利用可能である必要があります
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteAttributeTerminator } = handlers;
// コンポジションで使用
const attributePipeline = compose(deleteAttributeGroup, deleteAttributeTerminator);