メインコンテンツまでスキップ
バージョン: 0.5.0 (最新)

👤 ユーザーサービス

Testing Status

ユーザーサービスは、CRUD操作とユーザーアカウントのロック/ロック解除でユーザーエンティティを管理するための完全な REST API を提供します。NodeBlocks の関数型合成アプローチで構築され、MongoDB とシームレスに統合します。


🚀 クイックスタート

import express from 'express';
import { middlewares, services, drivers } from '@nodeblocks/backend-sdk';

const { nodeBlocksErrorMiddleware } = middlewares;
const { userService } = services;
const { getMongoClient } = drivers;

const client = getMongoClient('mongodb://localhost:27017', 'dev');

express()
.use(
userService(
{
users: client.collection('users'),
identities: client.collection('identities'),
},
{
authSecrets: {
authEncSecret: 'your-encryption-secret', // JWT 暗号化シークレット
authSignSecret: 'your-signing-secret', // JWT 署名シークレット
},
identity: {
typeIds: {
admin: '100', // 管理者ユーザー種別識別子
guest: '000', // ゲストユーザー種別識別子
regular: '001', // 一般ユーザー種別識別子
},
},
}
)
)
.use(nodeBlocksErrorMiddleware())
.listen(8089, () => console.log('Server running'));

📋 エンドポイント概要

メソッドパス説明認可
POST/users新しいユーザーを作成ベアラートークン必須
GET/users/:profileIdIDでユーザーを取得ベアラートークン必須(管理者またはプロファイル所有者)
GET/usersユーザーを一覧/フィルタベアラートークン必須(管理者のみ)
PATCH/users/:profileIdユーザーを更新ベアラートークン必須(管理者またはプロファイル所有者)
DELETE/users/:profileIdユーザーを削除ベアラートークン必須(管理者またはプロファイル所有者)
POST/identities/:identityId/lockユーザーアカウントをロックベアラートークン必須(管理者のみ)
POST/identities/:identityId/unlockユーザーアカウントをロック解除ベアラートークン必須(管理者のみ)

ファイルアップロード操作

メソッドパス説明認可
GET/user-profiles/:profileId/avatar-upload-urlユーザーアバターアップロード用の署名付きURLを取得ベアラートークン必須(管理者またはプロファイル所有者)

🗄️ エンティティスキーマ

ユーザーエンティティは、自動生成されるベースフィールドとユーザー固有のデータで構成されます:

{
"id": "string",
"createdAt": "string (datetime)",
"updatedAt": "string (datetime)",
"identityId": "string",
"name": "string",
"avatar": {
"url": "string",
"objectId": "string"
} | null
}

フィールド詳細

フィールド自動生成必須説明
idstring一意識別子(UUID)
createdAtdatetime作成日時
updatedAtdatetime最終更新日時
identityIdstringリンクされたアイデンティティ識別子
namestringユーザーの表示名
avatarobject or nullユーザーアバターメタデータまたはnull

📝 注意: 自動生成フィールドはサービス側で設定され、作成/更新リクエストに含めないでください。

🖼️ アバター: avatar フィールドは null またはストレージメタデータを含むオブジェクトにすることができます。


🔐 認証ヘッダー

すべてのエンドポイントで、次のヘッダーを含めてください:

Authorization: Bearer <access_token>
x-nb-fingerprint: <device_fingerprint>

⚠️ 重要: 認可時にフィンガープリントを指定した場合、認証済みのすべてのリクエストで x-nb-fingerprint ヘッダーが必須です。欠如している場合は 401 Unauthorized が返ります。


🔧 APIエンドポイント

1. ユーザー作成

提供された情報で新しいユーザーを作成します。

リクエスト:

  • メソッド: POST
  • パス: /users
  • ヘッダー:
    • Content-Type: application/json
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラートークン必須

リクエストボディ:

フィールド必須説明
identityIdstringリンクされたアイデンティティ識別子
namestringユーザーの表示名

レスポンスボディ:

フィールド説明
idstring一意のユーザー識別子
identityIdstringリンクされたアイデンティティ識別子
namestringユーザーの表示名
avatarobject or nullユーザーアバターメタデータまたはnull
createdAtstring作成日時
updatedAtstring最終更新日時

バリデーション:

  • スキーマ検証: 自動強制(identityIdおよびname必須; 追加プロパティ不許可)
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロールまたは対象アイデンティティの自己必須

リクエスト例:

curl -X POST {{host}}/users \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"identityId": "811ff0a3-a26f-447b-b68a-dd83ea4000b9",
"name": "John Doe"
}'

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"identityId": "811ff0a3-a26f-447b-b68a-dd83ea4000b9",
"name": "John Doe",
"createdAt": "2024-05-28T09:41:22.552Z",
"updatedAt": "2024-05-28T09:41:22.552Z"
}

エラーレスポンス:

リクエストボディに必須フィールドがない場合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'identityId'",
"request body must have required property 'name'",
"request body must NOT have additional properties"
]
}
}

認可トークンが提供されていない場合:

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
"error": {
"message": "token could not be verified"
}
}

データベース挿入操作が挿入されたIDを返せなかった場合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Failed to create user"
}
}

予期しないエラーが発生した場合(DB接続問題など):

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to create user"
}
}

2. IDでユーザー取得

一意のIDで特定のユーザーを取得します。

リクエスト:

  • メソッド: GET
  • パス: /users/:profileId
  • ヘッダー:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラートークン必須(管理者またはプロファイル所有者)

URL パラメータ:

パラメータ必須説明
profileIdstring一意のユーザー識別子

レスポンスボディ:

フィールド説明
idstring一意のユーザー識別子
identityIdstringリンクされたアイデンティティ識別子
namestringユーザーの表示名
avatarobject or nullユーザーアバターメタデータまたはnull
createdAtstring作成日時
updatedAtstring最終更新日時

バリデーション:

  • スキーマ検証: パスパラメータ検証(profileId必須)
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロールまたは対象プロファイルの所有者必須

リクエスト例:

curl {{host}}/users/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2 \
-H "Authorization: Bearer your-access-token-here"

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"identityId": "811ff0a3-a26f-447b-b68a-dd83ea4000b9",
"name": "John Doe",
"avatar": null,
"createdAt": "2024-05-28T09:41:22.552Z",
"updatedAt": "2024-05-28T09:41:22.552Z"
}

エラーレスポンス:

認可トークンが提供されていない場合:

HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
"error": {
"message": "token could not be verified"
}
}

ユーザーがこのリソースにアクセスする権限がない場合:

HTTP/1.1 403 Forbidden
Content-Type: application/json

{
"error": {
"message": "Identity is not authorized to access this resource"
}
}

指定IDのユーザーが存在しない場合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "User profile not found"
}
}

予期しないエラーが発生した場合(DB接続問題など):

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to get user"
}
}

3. ユーザー一覧

フィルタやページングを指定してユーザーの一覧を取得します。

リクエスト:

  • メソッド: GET
  • パス: /users
  • ヘッダー:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラートークン必須(管理者のみ)

クエリパラメータ:

パラメータ必須説明
namestring表示名でユーザーをフィルタ
pagenumberページ番号
limitnumber1ページあたりの件数

レスポンスボディ:

フィールド説明
idstring一意のユーザー識別子
identityIdstringリンクされたアイデンティティ識別子
namestringユーザーの表示名
avatarobject or nullユーザーアバターメタデータまたはnull
createdAtstring作成日時
updatedAtstring最終更新日時

バリデーション:

  • スキーマ検証: name(string)、pageおよびlimit(最小/最大制約のある整数)のクエリパラメータ検証
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロール必須

リクエスト例:

全件取得:

curl {{host}}/users \
-H "Authorization: Bearer <access-token>"

アクティブユーザーをフィルタ:

curl "{{host}}/users?status=active" \
-H "Authorization: Bearer <access-token>"

メールアドレスでフィルタ:

curl "{{host}}/users?email=john.doe@example.com" \
-H "Authorization: Bearer <access-token>"

名前でフィルタ:

curl "{{host}}/users?name=John" \
-H "Authorization: Bearer <access-token>"

フィルタを組み合わせる:

curl "{{host}}/users?name=John&page=1&limit=20" \
-H "Authorization: Bearer <access-token>"

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

[
{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"identityId": "811ff0a3-a26f-447b-b68a-dd83ea4000b9",
"name": "John Doe",
"avatar": null,
"createdAt": "2024-05-28T09:41:22.552Z",
"updatedAt": "2024-05-28T09:41:22.552Z"
},
{
"id": "8fec096b-1bc7-5bfe-c827-3600e8fe2790",
"identityId": "922ff1b4-b37g-558c-c79b-ee94fb5001c0",
"name": "Jane Smith",
"avatar": { "url": "https://...", "objectId": "avatar-obj-1" },
"createdAt": "2024-05-29T10:15:33.441Z",
"updatedAt": "2024-05-29T10:15:33.441Z"
}
]

エラーレスポンス:

予期しないエラーが発生した場合(DB接続問題、無効なフィルタ構文など):

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to find users"
}
}

4. ユーザー更新

部分更新で既存のユーザーを更新します。

リクエスト:

  • メソッド: PATCH
  • パス: /users/:profileId
  • ヘッダー:
    • Content-Type: application/json
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラートークン必須(管理者またはプロファイル所有者)

URL パラメータ:

パラメータ必須説明
profileIdstring一意のユーザー識別子

リクエストボディ(必須、全フィールド任意):

フィールド必須説明
avatarobject or nullユーザーアバターメタデータまたはnull
namestringユーザーの表示名

注意: リクエストボディ内の全フィールドが任意ですが、リクエストボディ自体は必須であり、空にすることはできません。空のボディを送信すると400エラーが発生します。

レスポンスボディ:

フィールド説明
idstring一意のユーザー識別子
identityIdstringリンクされたアイデンティティ識別子
namestring更新後のユーザーの表示名
avatarobject or null更新後のユーザーアバターメタデータまたはnull
createdAtstring作成日時
updatedAtstring最終更新日時

バリデーション:

  • スキーマ検証: 自動強制(nameおよびavatarのみ許可; 追加プロパティ不許可)
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロールまたは対象プロファイルの所有者必須

リクエスト例:

curl -X PATCH {{host}}/users/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{"status": "inactive"}'

成功レスポンス:

HTTP/1.1 200 OK
Content-Type: application/json

{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"identityId": "811ff0a3-a26f-447b-b68a-dd83ea4000b9",
"name": "John Doe",
"avatar": null,
"createdAt": "2024-05-28T09:41:22.552Z",
"updatedAt": "2024-05-28T14:22:15.789Z"
}

エラーレスポンス:

リクエストボディが空またはない場合:

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Request body is required"
}
}

指定IDのユーザーが存在しない場合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "User profile not found"
}
}

更新操作でデータが変更されない場合(変更なし):

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
"error": {
"message": "Failed to update user"
}
}

予期しないエラーが発生した場合(DB接続問題など):

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to update user"
}
}

5. ユーザー削除

システムからユーザーを完全に削除します。

リクエスト:

  • メソッド: DELETE
  • パス: /users/:profileId
  • ヘッダー:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラートークン必須(管理者またはプロファイル所有者)

URL パラメータ:

パラメータ必須説明
profileIdstring一意のユーザー識別子

レスポンスボディ:

フィールド説明
なし-成功時はレスポンスボディなし

バリデーション:

  • スキーマ検証: なし(DELETE リクエスト)
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロールまたは対象プロファイルの所有者必須

リクエスト例:

curl -X DELETE {{host}}/users/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2 \
-H "Authorization: Bearer <access-token>"

成功レスポンス:

HTTP/1.1 204 No Content

エラーレスポンス:

指定IDのユーザーが存在しない場合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "User not found"
}
}

予期しないエラーが発生した場合(DB接続問題など):

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to delete user"
}
}

6. ユーザーアカウントロック

isLockedtrue に設定してユーザーアカウントをロックします。

リクエスト:

  • メソッド: POST
  • パス: /identities/:identityId/lock
  • ヘッダー:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラートークン必須(管理者のみ)

URL パラメータ:

パラメータ必須説明
identityIdstring一意のアイデンティティ識別子

レスポンスボディ:

フィールド説明
なし-成功時はレスポンスボディなし

バリデーション:

  • スキーマ検証: なし(リクエストボディなし)
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロール必須

リクエスト例:

curl -X POST {{host}}/identities/811ff0a3-a26f-447b-b68a-dd83ea4000b9/lock \
-H "Authorization: Bearer <access-token>"

成功レスポンス:

HTTP/1.1 204 No Content

エラーレスポンス:

指定IDのユーザーが存在しない場合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "User not found"
}
}

予期しないエラーが発生した場合(DB接続問題など):

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to lock user"
}
}

7. ユーザーアカウントロック解除

isLockedfalse に設定してユーザーアカウントのロックを解除します。

リクエスト:

  • メソッド: POST
  • パス: /identities/:identityId/unlock
  • ヘッダー:
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • 認可: ベアラートークン必須(管理者のみ)

URL パラメータ:

パラメータ必須説明
identityIdstring一意のアイデンティティ識別子

レスポンスボディ:

フィールド説明
なし-成功時はレスポンスボディなし

バリデーション:

  • スキーマ検証: なし(リクエストボディなし)
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロール必須

リクエスト例:

curl -X POST {{host}}/identities/811ff0a3-a26f-447b-b68a-dd83ea4000b9/unlock

成功レスポンス:

HTTP/1.1 204 No Content

エラーレスポンス:

指定IDのユーザーが存在しない場合:

HTTP/1.1 404 Not Found
Content-Type: application/json

{
"error": {
"message": "User not found"
}
}

予期しないエラーが発生した場合(DB接続問題など):

HTTP/1.1 500 Internal Server Error
Content-Type: application/json

{
"error": {
"message": "Failed to unlock user"
}
}

8. アバターアップロードURL取得

ユーザーアバター画像を安全にアップロードするための署名付きURLを生成します。オブジェクトIDと一時的な署名付きURLを返します。

リクエスト:

  • メソッド: GET
  • パス: /user-profiles/:profileId/avatar-upload-url
  • ヘッダー: Authorization: Bearer <token>
  • 認可: ベアラートークン必須(管理者またはプロファイル所有者)

URL パラメータ:

パラメータ必須説明
profileIdstring対象ユーザーID

クエリパラメータ:

パラメータ必須説明
contentTypestring画像MIMEタイプ(例: image/png
contentLengthnumberファイルサイズ(バイト単位、最大10MB)

レスポンスボディ:

フィールド説明
objectIdstringアバター用の生成されたストレージオブジェクトID
urlstringファイルをアップロードするための署名付きURL

バリデーション:

  • スキーマ検証: 画像アップロードスキーマを使用(コンテンツタイプとサイズ制約)
  • ルートバリデーション:
    • 認証済みリクエスト(ベアラー)必須
    • 管理者ロールまたは対象プロファイルの所有者必須

リクエスト例:

curl "{{host}}/user-profiles/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/avatar-upload-url?contentType=image/jpeg&contentLength=524288" \
-H "Authorization: Bearer <access-token>"

成功レスポンス:

{
"objectId": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"url": "https://storage.googleapis.com/bucket/avatars/...&X-Goog-Expires=900&X-Goog-Signature=..."
}

⚙️ 設定オプション

サービス設定

interface UserServiceConfiguration {
authSecrets: {
authEncSecret: string; // JWT 暗号化シークレット
authSignSecret: string; // JWT 署名シークレット
};
identity?: {
typeIds?: {
admin: string; // 管理者ユーザー種別識別子
guest: string; // ゲストユーザー種別識別子
regular: string; // 一般ユーザー種別識別子
};
};
}

設定詳細

ユーザーサービスの設定は、セキュリティおよびユーザー種別管理の論理グループに整理されています。

🔐 セキュリティ設定

authSecrets - JWT トークンのセキュリティシークレット

  • : { authEncSecret: string; authSignSecret: string }
  • 説明: JWT の暗号化および署名に使用する秘密鍵(トークン検証に使用)
  • 必須: 本番環境では必須
  • 子プロパティ:
    • authEncSecret: JWT ペイロード暗号化の秘密鍵
    • authSignSecret: JWT 署名検証の秘密鍵

👥 ユーザー種別設定

user.typeIds - ユーザー種別識別子の設定

  • : { admin?: string; guest?: string; user?: string }
  • 説明: ロールベースアクセス制御のためのカスタムユーザー種別識別子
  • デフォルト: undefined(デフォルトの種別検証を使用)
  • 子プロパティ:
    • admin: 管理者ユーザー種別の識別子
      • : string
      • 説明: 管理者ユーザーのカスタム識別子
      • 利用例: 管理操作のロールベースアクセス制御
      • : "admin", "administrator", "superuser"
    • guest: ゲストユーザー種別の識別子
      • : string
      • 説明: ゲストユーザーのカスタム識別子
      • 利用例: 未認証/一時ユーザーの限定的アクセス
      • : "guest", "visitor", "anonymous"
    • user: 一般ユーザー種別の識別子
      • : string
      • 説明: 一般ユーザーのカスタム識別子
      • 利用例: 標準的なユーザー権限
      • : "user", "member", "customer"

設定例

const userConfig = {
authSecrets: {
authEncSecret: process.env.AUTH_ENC_SECRET || 'your-enc-secret',
authSignSecret: process.env.AUTH_SIGN_SECRET || 'your-sign-secret'
},
user: {
typeIds: {
admin: '100',
guest: '000',
user: '001'
}
}
};

🚨 エラーハンドリング

ユーザーサービスのエラーは、適切なHTTPステータスコードとJSON形式で返されます:

代表的なエラーコード

ステータスエラーメッセージ説明
400Validation Errorリクエストボディ形式が無効または必須フィールドがない
400Failed to create userデータベース挿入操作が挿入されたIDを返せなかった
400Failed to update user更新操作でデータが変更されない(変更なし)
401token could not be verified認可トークンがない/無効
403Identity is not authorized to access this resource権限が不十分
403User is not authorized to access this resourceユーザーに必要な権限がない(管理者アクセス)
404User profile not foundGET/PATCH操作の対象ユーザーが存在しない
404User not foundDELETE/lock/unlock操作の対象ユーザーが存在しない
500Failed to create user作成中のDB接続問題/予期せぬ失敗
500Failed to get user取得中のDB接続問題/予期せぬ失敗
500Failed to find users一覧取得中のDB接続問題/フィルタ構文不正/予期せぬ失敗
500Failed to update user更新中のDB接続問題/予期せぬ失敗
500Failed to delete user削除中のDB接続問題/予期せぬ失敗
500Failed to lock userアカウントロック中のDB接続問題/予期せぬ失敗
500Failed to unlock userアカウントロック解除中のDB接続問題/予期せぬ失敗

エラーレスポンス形式

{
"error": {
"message": "Error message description",
"data": ["Additional error details"]
}
}

検証エラーには追加の詳細が含まれます:

{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'identityId'",
"request body must have required property 'name'"
]
}
}

🔗 関連ドキュメント