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

🛣️ Location routes

Location route は SDK composer であり、Express ミドルウェアではありません。読み取りは公開されています;変更操作は isAuthenticated()checkIdentityType(['admin']) を要求します。

目録

ルートメソッド / プロトコルパススキーマバリデータ成功ステータス
createLocationRoutePOST / HTTP/locationscreateLocationSchemaisAuthenticated()checkIdentityType(['admin'])201
getLocationRouteGET / HTTP/locations/:locationIdgetLocationSchemaなし200
updateLocationRoutePATCH / HTTP/locations/:locationIdupdateLocationSchemaisAuthenticated()checkIdentityType(['admin'])200
deleteLocationRouteDELETE / HTTP/locations/:locationIddeleteLocationSchemaisAuthenticated()checkIdentityType(['admin'])204
findLocationsRouteGET / HTTP/locationsfindLocationsSchemaなし200

詳細

createLocationRoute

実装

エンドポイント: POST /locations

POST /locations は認証済み管理者のためにルートまたは子の位置情報を作成し、作成された位置情報を 201 で返します;親が欠落している場合 404 です。

アクセス: 管理者。ファクトリは isAuthenticated() を実行し、次に checkIdentityType(['admin']) を実行します。

リクエスト: 必須の厳密な application/json ボディ(createLocationSchema 由来):文字列の namecodetype、 plus オプションの文字列 parentId;パスまたはクエリパラメータはありません。デフォルト/未設定の Bearer モードでは、Authorization: Bearer <access-token> を送信します;authMode: 'cookie' の場合、代わりに accessToken クッキーを送信します。真理値の parentId は階層作成前に読み込まれます。

パイプライン: 親がある場合のみ getLocationByIdbuildAncestorsFromParentbuildLocationToCreatecreateLocationgetLocationByIdorThrow

成功: 作成された位置情報を含む明示的な 201:Mongo _id は投影除外され、normalizeLocation が合成されていないため parentIdancestors は残ります。

失敗: 親ルックアップまたは作成後ルックアップからの LocationNotFoundBlockError404 にマッピングされます;作成/読み取りデータベースエラーは 500 にマッピングされます。リンクされた��リデータが最初に実行され、文書化された認証、セットアップ、または認可エラーで失敗する可能性があります。

完全なソースを表示
export const createLocationRoute = withRoute({
handler: compose(
ifElse(
match(Boolean, ['params', 'requestBody', 'parentId']),
compose(
withLogging(
applyPayloadArgs(
getLocationById,
[
['context', 'db', 'locations'],
['params', 'requestBody', 'parentId'],
],
'parentLocation',
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
buildAncestorsFromParent,
[
['context', 'data', 'parentLocation', 'ancestors'],
['params', 'requestBody', 'parentId'],
],
'ancestors',
),
),
),
),
applyPayloadArgs(noop, [[]]),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
buildLocationToCreate,
[
['params', 'requestBody'],
['context', 'data', 'ancestors'],
],
'locationToCreate',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
createLocation,
[
['context', 'db', 'locations'],
['context', 'data', 'locationToCreate'],
],
'locationId',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
getLocationById,
[
['context', 'db', 'locations'],
['context', 'data', 'locationId'],
],
'location',
),
),
),
lift(
withLogging(
orThrow(
[
[LocationNotFoundBlockError, 404],
[LocationUnexpectedDBError, 500],
],
[['context', 'data', 'location'], 201],
),
),
),
),
method: 'POST',
path: '/locations',
validators: [isAuthenticated(), checkIdentityType(['admin'])],
});

getLocationRoute

実装

エンドポイント: GET /locations/:locationId

GET /locations/:locationId は 1 つの公開位置情報を取得し、200 で返します;不明な ID は 404 です。

アクセス: 公開。

リクエスト: getLocationSchema はパスの locationId を要求します;ボディまたはクエリはありません。

パイプライン: getLocationByIdorThrow

成功: Mongo _id が投影除外された明示的な 200normalizeLocation が合成されていないため parentIdancestors は残ります。

失敗: 位置情報欠落の 404 またはデータベースエラーの 500

完全なソースを表示
export const getLocationRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(
getLocationById,
[
['context', 'db', 'locations'],
['params', 'requestParams', 'locationId'],
],
'location',
),
),
lift(
withLogging(
orThrow(
[
[LocationNotFoundBlockError, 404],
[LocationUnexpectedDBError, 500],
],
[['context', 'data', 'location'], 200],
),
),
),
),
method: 'GET',
path: '/locations/:locationId',
validators: [],
});

updateLocationRoute

実装

エンドポイント: PATCH /locations/:locationId

PATCH /locations/:locationId は管理者が選択した位置情報を更新し、再読み込みされた公開投影を 200 で返します;不明な ID は 404 です。

アクセス: 管理者;isAuthenticated() 次に checkIdentityType(['admin'])

リクエスト: updateLocationSchema は文字列のパス locationId と必須の厳密な application/json ボディを要求します。オプションのボディフィールドは文字列の codenametype のみ(空オブジェクトはスキーマ有効);parentId は受け付けられません。クエリパラメータはありません。デフォルトでは Authorization: Bearer <access-token> を使用し、またはクッキーモードで accessToken クッキーを使用します。

パイプライン: updateLocationgetLocationByIdorThrow

成功: 再読み込みされた getLocationById 投影を含む明示的な 200:Mongo _id は省略されますが、parentIdancestors は残ります。

失敗: 更新または再読み込みからの LocationNotFoundBlockError404 にマッピングされます;更新/読み取りデータベースエラーは 500 にマッピングされます。リンクされたバリデータが最初に実行され、文書化された認証、セットアップ、または認可エラーで失敗する可能性があります。

完全なソースを表示
export const updateLocationRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(
updateLocation,
[
['context', 'db', 'locations'],
['params', 'requestBody'],
['params', 'requestParams', 'locationId'],
],
'hasUpdatedLocation',
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
getLocationById,
[
['context', 'db', 'locations'],
['params', 'requestParams', 'locationId'],
],
'location',
),
),
),
lift(
withLogging(
orThrow(
[
[LocationNotFoundBlockError, 404],
[LocationUnexpectedDBError, 500],
],
[['context', 'data', 'location'], 200],
),
),
),
),
method: 'PATCH',
path: '/locations/:locationId',
validators: [isAuthenticated(), checkIdentityType(['admin'])],
});

deleteLocationRoute

実装

エンドポイント: DELETE /locations/:locationId

DELETE /locations/:locationId は子孫がない場合にのみ管理者が選択した位置情報を削除し、204 を返します;子孫がある場合 409 になります。

アクセス: 管理者;isAuthenticated() 次に checkIdentityType(['admin'])

リクエスト: deleteLocationSchema は文字列のパス locationId を要求します;ボディまたはクエリはありません。デフォルトでは Authorization: Bearer <access-token> を使用し、またはクッキーモードで accessToken クッキーを使用します。

パイプライン: buildDescendantsFilterfindLocationsassertNoDescendantLocationsdeleteLocation → 空のボディ → orThrow

成功: ターミネーターは明示的に { data: {}, statusCode: 204 } 記述子を返します;Express サービスは res.status(204).json({}) を呼び出し、HTTP 204 応答にはボディがありません。

失敗: assertNoDescendantLocations からの LocationConflictError409 にマッピングされます;クエリ/削除データベースエラーは 500 にマッピングされます。ターミネーターが LocationNotFoundBlockError404 にマッピングしますが、このパイプラインは当該エラーを生成する block を呼び出しません:ターゲットが欠落すると deleteLocationLocationUnexpectedDBError を返すため 500 になります。リンクされたバリデータが最初に実行され、文書化された認証、セットアップ、または認可エラーで失敗する可能性があります。

完全なソースを表示
export const deleteLocationRoute = withRoute({
handler: compose(
withLogging(
applyPayloadArgs(buildDescendantsFilter, [['params', 'requestParams', 'locationId']], 'ancestorsFilter'),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
findLocations,
[
['context', 'db', 'locations'],
['context', 'data', 'ancestorsFilter'],
],
'childLocations',
),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(assertNoDescendantLocations, [['context', 'data', 'childLocations']], 'hasNoChildLocations'),
),
),
flatMapAsync(
withLogging(
applyPayloadArgs(
deleteLocation,
[
['context', 'db', 'locations'],
['params', 'requestParams', 'locationId'],
],
'hasDeletedLocation',
),
),
),
flatMapAsync(withLogging(applyPayloadArgs(partial(noop, [{}]), [[]], 'normalizedBody'))),
lift(
withLogging(
orThrow(
[
[LocationNotFoundBlockError, 404],
[LocationConflictError, 409],
[LocationUnexpectedDBError, 500],
],
[['context', 'data', 'normalizedBody'], 204],
),
),
),
),
method: 'DELETE',
path: '/locations/:locationId',
validators: [isAuthenticated(), checkIdentityType(['admin'])],
});

findLocationsRoute

実装

エンドポイント: GET /locations

GET /locations はページネーション付きの公開位置を一覧表示し、200 を返します;データベースクエリ失敗は 500 です。

アクセス: 公開。

リクエスト: findLocationsSchema はオプションの整数クエリ page11000)と limit150)を受け入れます;ボディまたはパスパラメータはありません。withPagination は欠落値をページ 1 と制限 10 にデフォルトし、残りのクエリフィルターを findLocations に渡す前にそれら 2 つのキーを削除します。

パイプライン: findLocations 周りの withPaginationapplySpec 応答ビルダー → orThrow

成功: { data, metadata: { pagination } } を含む明示的な 200。各位置情報は Mongo _id が投影除外されています;ページネーションは { hasNext, hasPrev, limit, page, total, totalPages } です。

失敗: 位置情報クエリからの LocationUnexpectedDBError500 にマッピングされます。ソースは LocationNotFoundBlockError404 マッピングもリストしていますが、findLocations は当該エラーではなく空の配列を返すため、このルートは空の結果に対して 404 を生成しません。

完全なソースを表示
export const findLocationsRoute = withRoute({
handler: compose(
withPagination(
withLogging(
applyPayloadArgs(
findLocations,
[
['context', 'db', 'locations'],
['params', 'requestQuery'],
],
'locations',
),
),
),
flatMapAsync(
applyPayloadArgs(
applySpec({data: nthArg(0), metadata: {pagination: nthArg(1)}}),
[
['context', 'data', 'locations', 'data'],
['context', 'data', 'locations', 'metadata'],
],
'normalizedBody',
),
),
lift(
withLogging(
orThrow(
[
[LocationNotFoundBlockError, 404],
[LocationUnexpectedDBError, 500],
],
[['context', 'data', 'normalizedBody'], 200],
),
),
),
),
method: 'GET',
path: '/locations',
validators: [],
});