メインコンテンツまでスキップ
バージョン: 0.13.0 (Previous)

🛒 注文

Order は、orderService を通じて認証済みの作成、取得、検索、更新、削除、および組織スコープの注文一覧を提供します。

はじめに

orderService(dataStores, configuration) は Express ルーターを返します。型付けされたサービスストアには ordersidentities が含まれます。組織スコープの一覧ルートをマウントする場合は 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.authEncSecretauthSecrets.authSignSecret必須選択されたアクセストークン認証アダプターで使用されます。
identity.typeIds.admin5 つの管理者代替ルートで必須checkIdentityType(['admin']) が呼び出し元アイデンティティと比較します。
organization.roles.ownerorganization.roles.adminorganization.roles.member組織スコープルートで必須hasOrgRole(['owner', 'admin', 'member'], ...) が使用します。

よくあるタスク

タスク開始地点契約
注文を作成するcreateOrderFeaturecreateOrderFeaturecreateOrderRoutecreateOrderSchema
注文を読み取り、更新、または削除するgetOrderRoutegetOrderRouteupdateOrderRoutedeleteOrderRoute とそれぞれにリンクされたスキーマ
1 つのアイデンティティの注文を一覧表示するfindOrdersRoutefindOrdersRoutefindOrdersSchema。管理者以外の呼び出し元はその identityId である必要があります。
組織の注文を一覧表示するfindOrdersByOrganizationIdRoutefindOrdersByOrganizationIdRoute とクロスドメインの 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 トランスポートでは、このホストフラグメントをサービスマウント前に実行する必要があります。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 には authSecretsidentity.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 の基になるページネーション済みクエリプリミティブを提供します。