👥 プロフィール
Profile サービスは、認証済み HTTP ルートを通じて、プロフィールレコード、アバター、プロフィールのフォロー、組織のフォロー、プロダクトへのいいねを管理します。
はじめに
読み書きする 4 つのコレクションを指定して services.profileService をマウントします。JSON リクエスト本文にはホストアプリケーションの express.json() ミドルウェアが必要です。Cookie トランスポートには、このルーターの前に cookie-parser も必要です。
import express from 'express';
import cookieParser from 'cookie-parser';
import { services } from '@nodeblocks/backend-sdk';
const app = express();
app.use(express.json());
app.use(cookieParser()); // `authMode` が 'cookie' の場合のみ必須。
app.use(
'/api',
services.profileService(
{ identities, profiles, organizations, products },
{
authSecrets: {
authEncSecret: process.env.AUTH_ENC_SECRET!,
authSignSecret: process.env.AUTH_SIGN_SECRET!,
},
authMode: 'bearer',
},
{ fileStorageDriver },
),
);
| 構成 | デフォルト / ソース動作 | 効果 |
|---|---|---|
authSecrets.authEncSecret | 必須。ルートコンテキストに渡される | 認証ユーティリティの構成。 |
authSecrets.authSignSecret | 必須。ルートコンテキストに渡される | 認証ユーティリティの構成。 |
authMode | 省略または 'bearer' は getBearerTokenInfo を選択 | 保護されたルートは Bearer トークンを読み取ります。 |
authMode: 'cookie' | 設定時に getCookieTokenInfo を選択 | 保護されたルートはアクセストークン Cookie を読み取ります。cookie-parser が必要です。 |
identity.typeIds | 指定時に管理者検査で読み取られる | 構成済み admin アイデンティティタイプ比較を有効にします。 |
よくあるタスク
| タスク | 開始地点 | 契約 |
|---|---|---|
| プロフィールを作成または更新する | createProfileFeature | createProfileFeature、updateProfileSchema、updateProfileRoute |
| プロフィール、そのフォロワー、または呼び出し元アイデンティティのプロフィールを読む | getProfileRoute | getProfileRoute、getProfileFollowersRoute、findProfilesByIdentityIdRoute |
| アバターアップロード URL を取得する | getAvatarUploadUrlFeature | getAvatarUploadUrlFeature、getSignedImageUploadUrlSchema、getAvatarUploadUrlRoute |
| フォローといいねの関係を管理する | プロフィールブロック | プロフィールブロック、ルート、スキーマ |
| 個別のエンドポイントを合成する | createProfileFeature | プロフィール機能と以下のカスタム合成 |
Bearer HTTP ワークフロー
authMode を省略するか 'bearer' に設定した場合は、Bearer トークンを送信します。この保護された更新は、管理者またはプロフィール所有者に許可されます。
PROFILE_ID='profile-demo-001'
ACCESS_TOKEN='replace-with-a-valid-access-token'
curl -X PATCH "https://api.example.test/api/profiles/$PROFILE_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"name":"Example profile"}'
成功時、ルートは明示的なステータスディスクリプターなしで正規化済みプロフィールを返します。呼び出し元は管理者であるか PROFILE_ID を所有している必要があります。プロフィールの欠落は 404、ファイルストレージ失敗は 500 にマッピングされます。updateProfileSchema、updateProfileRoute、プロフィールバリデーターを参照してください。
Cookie HTTP ワークフロー
authMode: 'cookie' を設定し、cookie-parser を登録して、Authorization ヘッダーの代わりに accessToken Cookie を送信します。同じ管理者または所有者の規則が適用されます。
PROFILE_ID='profile-demo-001'
ACCESS_TOKEN='replace-with-a-valid-access-token'
curl -X PATCH "https://api.example.test/api/profiles/$PROFILE_ID" \
-H "Cookie: accessToken=$ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"name":"Example profile"}'
成功レスポンスは、明示的なステータスディスクリプターなしの正規化済みプロフィールです。Cookie がない場合、Cookie 認証は 401 をスローします。updateProfileRouteとプロフィールバリデーターを参照してください。
カスタム機能の合成
この合成はフラグメントです。マウント前に profileService が提供するものと同じデータストア、構成、認証、省略可能なファイルストレージコンテキストが必要です。
import { partial } from 'ramda';
import { features, primitives, utils } from '@nodeblocks/backend-sdk';
const profileFeatureComposer = primitives.compose(features.createProfileFeature);
const profileRouter = primitives.defService(
partial(profileFeatureComposer, [{
authenticate: utils.getBearerTokenInfo,
configuration: { authSecrets },
dataStores: { identities, profiles, organizations, products },
fileStorageDriver,
}]),
);
app.use('/api', profileRouter);
リファレンスマップ
| ページ | 目的 |
|---|---|
| ブロック | 再利用可能なプロフィール操作とエラー。 |
| 機能 | スキーマからルートへのコンポーザー。 |
| ハンドラー | レガシーなルートパイプライン操作。 |
| ルート | パブリックエンドポイントマトリックス。 |
| スキーマ | リクエストおよび保存形状の契約。 |
| バリデーター | 認証および所有権ガード。 |
関連モジュール
Avatar はアバタースキーマと正規化処理を提供します。Identity はアイデンティティ検索とタイプ検査を提供します。Organization と Product は、フォローおよびいいねの対象リソースを提供します。共通バリデーター は共通ガードを、ファイルストレージ は署名付きアップロード、正規化、削除の動作を提供します。