メインコンテンツまでスキップ

ミドルウェア関数

ミドルウェア関数は、UIコンポーネントとバックエンドサービス間のコアビジネスロジックインターフェースを提供します。これらの関数は、求人マッチングプラットフォームの認証、データ管理、リアルタイムコミュニケーション、アプリケーションワークフローを処理します。


📋 目次


🔐 認証とセッション管理

関数説明使用例
onActionLoginメール/パスワード認証情報でユーザーを認証ログインフォーム、認証フロー
onActionLogoutユーザーログアウトを処理し、セッションデータをクリアログアウトボタン、セッション終了
onActionSignUp新しい求職者または雇用主アカウントを登録登録フォーム、ユーザーオンボーディング
onSuccessLoginログイン後のリダイレクトと初期化を処理ログイン成功処理
onSuccessLogoutログアウト後のクリーンアップとリダイレクトを処理ログアウト成功処理
onActionResendVerificationEmailユーザーにメール認証を再送信メール認証ワークフロー
onRequestPasswordChangeパスワードリセットプロセスを開始パスワード忘れフォーム
onResetPasswordSubmitトークン検証でパスワードリセットを完了パスワードリセット完了
onSessionStateUpdateセッション状態の変更と更新を処理セッション管理、トークン更新
isLoggedInユーザーが現在認証されているかチェック条件付きレンダリング、ルートガード
isNotLoggedInユーザーが認証されていないかチェック認証プロンプト、アクセス制御

👤 ユーザー管理

関数説明使用例
onUpdateUser求職者または雇用主のプロファイル情報を更新プロファイル編集フォーム
onLockUserユーザーアカウントをロック/停止(管理者機能)管理者ユーザー管理パネル
onUnlockUserユーザーアカウントをアンロック/復元(管理者機能)管理者ユーザー管理パネル
onDeactivateAccount現在のユーザーアカウントを非アクティブ化アカウント削除フロー
onCreateInvitation組織のチームメンバー招待を作成チームメンバー招待
onDeleteInvitation保留中のユーザー招待を削除/キャンセル招待管理
onAcceptInvitation組織チーム招待を受諾招待受諾ワークフロー
onChangePasswordユーザーの現在のパスワードを更新パスワード変更フォーム
onChangeEmailユーザーのメールアドレスを更新メール変更フォーム

🏢 組織管理

関数説明使用例
onCreateOrganization新しい雇用主組織を作成組織設定フォーム
onUpdateOrganization組織プロファイルと詳細を更新組織プロファイル編集
onFilterOrganizations組織リストをフィルタリングして検索組織ディレクトリ
onGetMoreOrganizationProducts組織の求人投稿をさらに読み込み組織求人リストのページネーション

💼 求人投稿とカタログ管理

関数説明使用例
onCreateProduct新しい求人投稿を作成求人投稿作成フォーム
onUpdateProduct既存の求人投稿を更新求人投稿編集フォーム
onFilterProducts求人リストをフィルタリングして検索求人検索とフィルタリング
onGetMoreProductsさらに求人投稿を読み込み(ページネーション)求人リストのページネーション
onGetAttributes求人スキルと属性を取得スキル選択、求人フィルタリング
onGetCategories求人カテゴリを読み込みカテゴリベースナビゲーション
onCreateProductAttachment求人関連ファイル添付をアップロード求人説明添付
onDeleteProductAttachment求人投稿の添付を削除添付管理

📝 応募と注文管理

関数説明使用例
onCreateOrder新しい求人応募を作成求人応募送信
onActionUpdateOrder応募ステータスと詳細を更新応募管理、ステータス更新
onFilterOrders求人応募をフィルタリングして検索応募検索とフィルタリング
onGetMoreOrdersさらに応募を読み込み(ページネーション)応募履歴のページネーション

💬 リアルタイムコミュニケーション

関数説明使用例
onCreateTopic雇用主と候補者間の新しいチャット会話を作成応募ベースチャット初期化
onSubscribeToTopicリアルタイム更新のためにチャットトピックを購読リアルタイムメッセージング設定
onSendMessage雇用主-候補者会話でメッセージを送信メッセージ送信インターフェース
onGetMoreMessages以前のメッセージ履歴を読み込みチャット履歴ページネーション
onGetMoreTopicsさらに会話トピックを読み込みチャットトピックリストページネーション
onUpdateMessageReadStatusメッセージを既読としてマーク既読ステータス追跡
appendMessagesToStateアプリケーション状態に新しいメッセージを追加リアルタイムメッセージ更新
onSocketSubscribeToUserIdユーザー固有のリアルタイム更新を購読ユーザー通知システム
onSocketUnSubscribeToUserIdユーザーリアルタイム更新の購読を解除ログアウト/アンマウント時のクリーンアップ
onSocketSubscribeToOrganizationId組織リアルタイム更新を購読雇用主通知システム
onSocketUnSubscribeToOrganizationId組織更新の購読を解除ナビゲーション時のクリーンアップ

🔍 検索とフィルタリング

関数説明使用例
onChangeSearchFilter求人検索条件を更新検索入力処理
onSelectFilter求人検索選択にフィルタを追加フィルタ選択UI
onRemoveSelectedFilter選択から特定フィルタを削除個別フィルタ削除

🧭 ナビゲーションとUI制御

関数説明使用例
onActionToggleMenuモバイル/サイドバーメニューを切り替えメニューボタン処理
redirectプログラマティックナビゲーションルート変更、リダイレクト

📄 ページネーション

すべてのページネーション関数は、それぞれのデータタイプの追加アイテム読み込みを処理します:

関数説明使用例
onGetMoreProducts追加求人投稿を読み込み求人リストの無限スクロール
onGetMoreOrders追加応募を読み込み応募履歴ページネーション
onGetMoreOrganizationProducts組織の求人投稿をさらに読み込み組織求人カタログページネーション
onGetMoreMessages追加チャットメッセージを読み込みチャット履歴読み込み
onGetMoreTopics追加会話トピックを読み込みチャットトピックリストページネーション

🚀 使用パターン

基本認証使用法

function LoginForm({ middleware }) {
const handleLogin = async (email, password) => {
const result = await middleware.onActionLogin({ email, password });

if (result.ok) {
// ログイン成功 - ダッシュボードにリダイレクト
console.log('ユーザーログイン:', result.value);
} else {
// 認証エラーを処理
console.error('ログイン失敗:', result.error);
}
};

return (
<form onSubmit={handleLogin}>
{/* メールとパスワードフィールド */}
</form>
);
}

求人投稿作成パターン

const handleCreateJobPosting = async (organizationId, jobData) => {
try {
const result = await middleware.onCreateProduct(organizationId, jobData);

if (result.ok) {
// 成功 - 求人投稿にリダイレクト
middleware.redirect('/jobs/' + result.value.id);
} else {
// ビジネスロジックエラーを処理
setError(result.error.message);
}
} catch (error) {
// ネットワーク/予期しないエラーを処理
setError('何かが間違っています');
}
};

求人応募フロー

function JobApplicationButton({ middleware, state, jobId, organizationId }) {
const handleApply = () => {
if (middleware.isLoggedIn()) {
// ユーザーは認証済み - 応募を作成
const applicationData = { jobId, coverLetter: state.coverLetter };
middleware.onCreateOrder(organizationId, applicationData);
} else {
// ログインにリダイレクト
middleware.redirect('/login');
}
};

return (
<button onClick={handleApply}>
求人に応募
</button>
);
}

リアルタイムメッセージング設定

useEffect(() => {
if (middleware.isLoggedIn() && currentUserId) {
// リアルタイム通知とメッセージを購読
middleware.onSocketSubscribeToUserId(
currentUserId,
(error) => console.error('ソケットエラー:', error),
(message) => {
// 受信メッセージを処理
console.log('新しいメッセージ:', message);
}
);

// アンマウント時のクリーンアップ
return () => {
middleware.onSocketUnSubscribeToUserId(currentUserId);
};
}
}, [currentUserId]);

💡 ベストプラクティス

Async/Awaitパターン

  • Promiseを返すミドルウェア関数では常にasync/awaitを使用
  • 成功と失敗の両方のケースを明示的に処理
  • 予期しないエラーにはtry/catchブロックを使用

結果パターン

  • result.valueにアクセスする前にokプロパティをチェック
  • ユーザーフィードバックのためにresult.errorを適切に処理
  • 結果ステータスをチェックせずに成功を仮定しない

状態管理

  • 直接API呼び出しの代わりにミドルウェア関数を使用
  • ミドルウェアに状態更新を自動処理させる
  • カスタム状態変更にはupdateStateを控えめに使用

エラーハンドリング

  • UIフィードバック用にユーザーフレンドリーなエラーメッセージを提供
  • デバッグ目的で詳細なエラーをログ
  • ネットワーク関連エラーの再試行メカニズムを実装

リアルタイムコミュニケーション

  • ソケット購読には常にエラーとメッセージハンドラーを提供
  • メモリリークを防ぐためにコンポーネントアンマウント時に購読をクリーンアップ
  • 接続状態変更を適切に処理