🛒 注文
Order は、orderService を通じて認証済みの作成、取得、検索、更新、削除、および組織スコープの注文一覧を提供します。
はじめに
orderService(dataStores, configuration) は Express ルーターを返します。型付けされたサービスストアには orders と identities が含まれます。組織スコープの一覧ルートをマウントする場合は organizations を含めてください。このルーターはすでに express.json() をインストールするため、このサービスマウントに追加の JSON パーサーは必要ありません。
import express from 'express';
import {services} from '@nodeblocks/backend-sdk';
const app = express();
app.use(
'/api',
services.orderService(
{identities, orders, organizations},
{
authSecrets: {
authEncSecret: 'replace-with-a-secret',
authSignSecret: 'replace-with-a-secret',
},
identity: {
typeIds: {
admin: '00000000-0000-4000-8000-000000000001',
guest: '00000000-0000-4000-8000-000000000002',
regular: '00000000-0000-4000-8000-000000000003',
},
},
organization: {
roles: {
admin: 'admin',
member: 'member',
owner: 'owner',
},
},
},
),
);
| 構成 | デフォルト / ソース動作 | 効果 |
|---|---|---|
dataStores.orders | 必須 | すべての Order ルートが読み書きします。 |
dataStores.identities | 必須 | 5 つの管理者または本人/所有者ルートで使われる checkIdentityType(['admin']) に必要です。 |
dataStores.organizations | 組織スコープルートで必須。サービス型では省略可能 | hasOrgRole(...) が GET /orders/organizations/:organizationId で読み取ります。このマウント済みルートはこれなしでは認可できません。 |
authSecrets.authEncSecret、authSecrets.authSignSecret | 必須 | 選択されたアクセストークン認証アダプターで使用されます。 |
identity.typeIds.admin | 5 つの管理者代替ルートで必須 | checkIdentityType(['admin']) が呼び出し元アイデンティティと比較します。 |
organization.roles.owner、organization.roles.admin、organization.roles.member | 組織スコープルートで必須 | hasOrgRole(['owner', 'admin', 'member'], ...) が使用します。 |
よくあるタスク
| タスク | 開始地点 | 契約 |
|---|---|---|
| 注文を作成する | createOrderFeature | createOrderFeature、createOrderRoute、createOrderSchema |
| 注文を読み取り、更新、または削除する | getOrderRoute | getOrderRoute、updateOrderRoute、deleteOrderRoute とそれぞれにリンクされたスキーマ |
| 1 つのアイデンティティの注文を一覧表示する | findOrdersRoute | findOrdersRoute と findOrdersSchema。管理者以外の呼び出し元はその identityId である必要があります。 |
| 組織の注文を一覧表示する | findOrdersByOrganizationIdRoute | findOrdersByOrganizationIdRoute とクロスドメインの findByOrganizationIdSchema |
Bearer HTTP ワークフロー
デフォルトモードでは、Authorization にアクセストークンを送信します。このリクエストは保護された createOrderRoute を対象とし、createOrderSchema に従います。呼び出し元が管理者でない限り、本文の identityId は呼び出し元と一致する必要があります。
curl --request POST 'http://localhost:3000/api/orders' \
--header 'Authorization: Bearer <access-token>' \
--header 'Content-Type: application/json' \
--data '{"identityId":"00000000-0000-4000-8000-000000000010","items":[{"productId":"00000000-0000-4000-8000-000000000011","quantity":1,"price":19.99}],"total":19.99}'
成功時には 201 と MongoDB の _id を含まない作成済み注文を返します。アクセストークンの欠落/無効は認証で失敗します。管理者分岐が成功しない限り、異なる本文アイデンティティは本人分岐で失敗します。
Cookie HTTP ワークフロー
Cookie トランスポートでは、このホストフラグメントをサービスマウント前に実行する必要があります。cookie-parser が選択された認証関数で読み取られる accessToken を提供します。
import cookieParser from 'cookie-parser';
app.use(cookieParser());
app.use('/api', services.orderService({identities, orders}, {...configuration, authMode: 'cookie'}));
次に、Authorization ヘッダーの代わりに Cookie を指定して、同じ createOrderSchema JSON 本文を createOrderRoute に送信します。
ACCESS_TOKEN='replace-with-a-valid-access-token'
curl --request POST 'http://localhost:3000/api/orders' \
--header "Cookie: accessToken=$ACCESS_TOKEN" \
--header 'Content-Type: application/json' \
--data '{"identityId":"00000000-0000-4000-8000-000000000010","items":[{"productId":"00000000-0000-4000-8000-000000000011","quantity":1,"price":19.99}],"total":19.99}'
成功レスポンスは、作成済み注文と MongoDB の _id なしの 201 のままです。呼び出し元は管理者であるか本文の identityId と一致する必要があります。accessToken Cookie の欠落は 401 です。
カスタム機能の合成
これは完全な Bearer モードのサービスフラグメントです。dataStores には選択した機能で必要となるコレクションを、configuration には authSecrets、identity.typeIds.admin、最後の機能を残す場合は organization.roles を含める必要があります。
import {partial} from 'ramda';
import {features, primitives, utils} from '@nodeblocks/backend-sdk';
const orderRouter = primitives.defService(
partial(
primitives.compose(
features.createOrderFeature,
features.updateOrderFeature,
features.getOrderFeature,
features.findOrdersFeature,
features.deleteOrderFeature,
features.findOrdersByOrganizationIdFeature,
),
[
{
authenticate: utils.getBearerTokenInfo,
configuration,
dataStores,
},
],
),
);
app.use('/api', orderRouter);
このコンポーザーは orderService と同じスキーマ/ルートペアを登録します。ホストが意図的に組織依存関係を提供しない場合にのみ、組織一覧機能を削除してください。
リファレンスマップ
| ページ | 目的 |
|---|---|
| ブロック | 再利用可能な注文クエリブロックとエラー。 |
| 機能 | スキーマからルートへのコンポーザー。 |
| ハンドラー | ルートパイプライン操作とターミネーター。 |
| ルート | エンドポイント、アクセス、レスポンスの契約。 |
| スキーマ | フィールドレベルのリクエスト検証。 |
| バリデーター | ローカル所有権と共通アクセス規則。 |
関連モジュール
Order サービス はサービスレベルの統合リファレンスです。共通バリデーター は認証、some(...)、管理者検査を提供します。組織ブロック はスコープルートが使う組織フィルターを提供し、組織スキーマ はそのリクエスト検証を追加します。Mongo ブロック は findOrders の基になるページネーション済みクエリプリミティブを提供します。