⚙️ 属性ハンドラーブロック
属性ハンドラーブロックは、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
: 直前のハンドラーからの属性グループオブジェクト
戻り値: データと statusCode を含む整形済みレスポンスオブジェクト
ペイロード要件:
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 の statusCode を持つレスポンスオブジェクト
ペイロード要件:
context.data.attributeGroupDeleted
が前のハンドラーから利用可能である必要があります
使用例:
import { handlers } from '@nodeblocks/backend-sdk';
const { deleteAttributeTerminator } = handlers;
// 合成で使用
const attributePipeline = compose(deleteAttributeGroup, deleteAttributeTerminator);