メむンコンテンツたでスキップ
バヌゞョン: 0.9.0 (最新)

📂 カテゎリサヌビス

Testing Status

Category Serviceは、ステヌタス制埡を備えた階局カテゎリを管理するための完党なREST APIを提䟛したす。Nodeblocksの関数型コンポゞションアプロヌチずMongoDB統合を䜿甚しお、商品カテゎリ、コンテンツ分類、組織構造を凊理するように蚭蚈されおいたす。


🚀 クむックスタヌト​

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

const { nodeBlocksErrorMiddleware } = middlewares;
const { categoryService } = services;
const { withMongo } = drivers;

const connectToDatabase = withMongo('mongodb://localhost:27017', 'dev', 'user', 'password');

express()
.use(
categoryService(
{
...(await connectToDatabase('categories')),
...(await connectToDatabase('identities')),
},
{
authSecrets: {
authEncSecret: 'your-encryption-secret',
authSignSecret: 'your-signing-secret',
},
identity: {
typeIds: {
admin: '100',
guest: '000',
regular: '001',
},
},
}
)
)
.use(nodeBlocksErrorMiddleware())
.listen(8089, () => console.log('Server running'));

📋 ゚ンドポむント抂芁​

カテゎリ操䜜​

MethodPath説明認蚌が必芁
POST/categories新しいカテゎリを䜜成✅ 管理者
GET/categories/:categoryIdIDでカテゎリを取埗❌
GET/categoriesすべおのカテゎリをリスト❌
PATCH/categories/:categoryIdカテゎリを曎新✅ 管理者
DELETE/categories/:categoryIdカテゎリを削陀✅ 管理者

ステヌタス管理操䜜​

MethodPath説明認蚌が必芁
POST/categories/:categoryId/enableカテゎリを有効化ステヌタスを'active'に蚭定✅ 管理者
POST/categories/:categoryId/disableカテゎリを無効化ステヌタスを'inactive'に蚭定✅ 管理者

🗄 ゚ンティティスキヌマ​

カテゎリ゚ンティティは、基本フィヌルド自動生成ずカテゎリ固有のデヌタを組み合わせたす

{
"name": "string",
"description": "string",
"status": "string",
"parent": "string",
"createdAt": "string (datetime)",
"id": "string",
"updatedAt": "string (datetime)"
}

フィヌルド詳现​

FieldType自動生成必須説明
namestring❌✅カテゎリ名
descriptionstring❌✅カテゎリの説明
statusstring❌✅カテゎリのステヌタス'active'、'inactive'など
parentstring❌❌階局構造のための芪カテゎリID
createdAtdatetime✅✅䜜成タむムスタンプ
idstring✅✅䞀意の識別子UUID
updatedAtdatetime✅✅最終曎新タむムスタンプ

📝 泚蚘: 自動生成フィヌルドはサヌビスによっお蚭定され、䜜成/曎新リク゚ストに含めるべきではありたせん。parentフィヌルドは階局カテゎリ構造を可胜にしたす。


🔐 認蚌ヘッダヌ​

保護された゚ンドポむントでは、次のヘッダヌを含めおください

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

⚠ 重芁: x-nb-fingerprintヘッダヌは、認蚌時にフィンガヌプリントが指定された堎合、すべおの認蚌枈みリク゚ストで必須です。これがない堎合、リク゚ストは401 Unauthorizedを返したす。


🔧 API゚ンドポむント​

1. カテゎリの䜜成​

提䟛された情報で新しいカテゎリを䜜成したす。

リク゚スト:

  • Method: POST
  • Path: /categories
  • Headers:
    • Content-Type: application/json
    • Authorization: Bearer <token>
    • x-nb-fingerprint: <device-fingerprint>
  • Authorization: Bearerトヌクンが必芁管理者

リク゚ストボディ:

FieldType必須説明
namestring✅カテゎリ名
descriptionstring✅カテゎリの説明
statusstring✅カテゎリのステヌタス
parentstring❌芪カテゎリID階局構造甚

レスポンスボディ:

FieldType説明
namestringカテゎリ名
descriptionstringカテゎリの説明
statusstringカテゎリのステヌタス
parentstring芪カテゎリID該圓する堎合
createdAtstring䜜成タむムスタンプ
idstring䞀意のカテゎリ識別子
updatedAtstring最終曎新タむムスタンプ

バリデヌション:

  • スキヌマバリデヌション: 自動的に匷制されたすname、description、status必須
  • ルヌトバリデヌタヌ:
    • 認蚌枈みリク゚ストが必芁bearerトヌクン
    • 管理者ロヌルが必芁

リク゚スト䟋:

curl -X POST http://localhost:8089/categories \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <admin_token>" \
-H "x-nb-fingerprint: <device-fingerprint>" \
-d '{
"name": "Electronics",
"description": "Electronic devices and accessories",
"status": "active"
}'

芪カテゎリ付きリク゚スト䟋:

curl -X POST http://localhost:8089/categories \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <admin_token>" \
-H "x-nb-fingerprint: <device-fingerprint>" \
-d '{
"name": "Smartphones",
"description": "Mobile phones and accessories",
"status": "active",
"parent": "682f4a3e-e37e-4480-bc36-dda085e7ce26"
}'

成功レスポンス:

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

{
"name": "Electronics",
"description": "Electronic devices and accessories",
"status": "active",
"createdAt": "2025-07-07T07:45:59.013Z",
"id": "682f4a3e-e37e-4480-bc36-dda085e7ce26",
"updatedAt": "2025-07-07T07:45:59.013Z"
}

゚ラヌレスポンス:

リク゚ストボディに必須フィヌルドがない堎合:

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

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

認蚌が倱敗した堎合:

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

{
"error": {
"message": "Token fails security check"
}
}

2. IDでカテゎリを取埗​

䞀意のIDで特定のカテゎリを取埗したす。

リク゚スト:

  • Method: GET
  • Path: /categories/:categoryId
  • Authorization: 䞍芁

URLパラメヌタ:

ParameterType必須説明
categoryIdstring✅䞀意のカテゎリ識別子

レスポンスボディ:

FieldType説明
namestringカテゎリ名
descriptionstringカテゎリの説明
statusstringカテゎリのステヌタス
parentstring芪カテゎリID該圓する堎合
createdAtstring䜜成タむムスタンプ
idstring䞀意のカテゎリ識別子
updatedAtstring最終曎新タむムスタンプ

バリデヌション:

  • スキヌマバリデヌション: categoryIdのパスパラメヌタバリデヌション
  • ルヌトバリデヌタヌ:
    • カテゎリが存圚するこずを怜蚌

リク゚スト䟋:

curl http://localhost:8089/categories/682f4a3e-e37e-4480-bc36-dda085e7ce26

成功レスポンス:

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

{
"name": "Electronics",
"description": "Electronic devices and accessories",
"status": "active",
"createdAt": "2025-07-07T07:45:59.013Z",
"id": "682f4a3e-e37e-4480-bc36-dda085e7ce26",
"updatedAt": "2025-07-07T07:45:59.013Z"
}

゚ラヌレスポンス:

指定されたIDのカテゎリが存圚しない堎合:

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

{
"error": {
"message": "Category does not exist"
}
}

3. カテゎリのリスト取埗​

すべおのカテゎリのリストを取埗したす。

リク゚スト:

  • Method: GET
  • Path: /categories
  • Authorization: 䞍芁

ク゚リパラメヌタ:

ParameterType必須説明
namestring❌カテゎリ名でフィルタ
descriptionstring❌説明でフィルタ
parentstring❌芪カテゎリIDでフィルタ
statusstring❌ステヌタスでフィルタ
pagenumber❌ペヌゞネヌションのペヌゞ番号1-1000
limitnumber❌ペヌゞあたりの項目数1-50

レスポンスボディ: カテゎリ配列ずメタデヌタを含むペヌゞネヌション付きレスポンス。

レスポンス構造:

{
"data": [
{
"name": "string",
"description": "string",
"status": "string",
"parent": "string",
"createdAt": "string",
"id": "string",
"updatedAt": "string"
}
],
"metadata": {
"pagination": {
"page": number,
"limit": number,
"total": number,
"totalPages": number,
"hasNext": boolean,
"hasPrev": boolean
}
}
}

バリデヌション:

  • スキヌマバリデヌション: name、description、parent、status、ペヌゞネヌションpage、limitのク゚リパラメヌタバリデヌション
  • ルヌトバリデヌタヌ: なし

リク゚スト䟋:

すべおのカテゎリをリスト:

curl http://localhost:8089/categories

ステヌタスでフィルタ:

curl "http://localhost:8089/categories?status=active"

成功レスポンス:

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

{
"data": [
{
"name": "Electronics",
"description": "Electronic devices and accessories",
"status": "active",
"createdAt": "2025-07-07T07:45:59.013Z",
"id": "682f4a3e-e37e-4480-bc36-dda085e7ce26",
"updatedAt": "2025-07-07T07:45:59.013Z"
},
{
"name": "Smartphones",
"description": "Mobile phones and accessories",
"status": "active",
"parent": "682f4a3e-e37e-4480-bc36-dda085e7ce26",
"createdAt": "2025-07-07T07:46:17.133Z",
"id": "4260c15e-7791-4f09-a846-b6ffa3a73101",
"updatedAt": "2025-07-07T07:46:17.133Z"
}
],
"metadata": {
"pagination": {
"page": 1,
"limit": 10,
"total": 2,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}
}

ペヌゞネヌション付きリク゚スト䟋:

curl "http://localhost:8089/categories?page=1&limit=10"

4. カテゎリの曎新​

郚分的なデヌタで既存のカテゎリを曎新したす。

リク゚スト:

  • Method: PATCH
  • Path: /categories/:categoryId
  • Headers: Content-Type: application/json
  • Authorization: 必芁管理者

URLパラメヌタ:

ParameterType必須説明
categoryIdstring✅䞀意のカテゎリ識別子

リク゚ストボディすべおのフィヌルドはオプション:

FieldType必須説明
namestring❌カテゎリ名
descriptionstring❌カテゎリの説明
parentstring❌芪カテゎリID

⚠ 重芁: statusフィヌルドは曎新リク゚ストでは蚱可されたせん。ステヌタスの倉曎には専甚のenable/disable゚ンドポむントを䜿甚しおください。

レスポンスボディ:

FieldType説明
namestring曎新されたカテゎリ名
descriptionstring曎新されたカテゎリの説明
statusstringカテゎリのステヌタス倉曎なし
parentstring曎新された芪カテゎリID該圓する堎合
createdAtstring䜜成タむムスタンプ
idstring䞀意のカテゎリ識別子
updatedAtstring最終曎新タむムスタンプ

バリデヌション:

  • スキヌマバリデヌション: 自動的に匷制されたす郚分曎新、限られたフィヌルドのみ蚱可
  • ルヌトバリデヌタヌ:
    • 認蚌枈みリク゚ストが必芁bearerトヌクン
    • 管理者ロヌルが必芁
    • カテゎリが存圚するこずを怜蚌

リク゚スト䟋:

curl -X PATCH http://localhost:8089/categories/682f4a3e-e37e-4480-bc36-dda085e7ce26 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <admin_token>" \
-d '{"description": "Updated electronic devices and accessories"}'

成功レスポンス:

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

{
"name": "Electronics",
"description": "Updated electronic devices and accessories",
"status": "active",
"createdAt": "2025-07-07T07:45:59.013Z",
"id": "682f4a3e-e37e-4480-bc36-dda085e7ce26",
"updatedAt": "2025-07-07T07:46:50.017Z"
}

゚ラヌレスポンス:

指定されたIDのカテゎリが存圚しない堎合:

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

{
"error": {
"message": "Category does not exist"
}
}

リク゚ストボディに蚱可されおいないフィヌルドが含たれおいる堎合:

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

{
"error": {
"message": "Validation Error",
"data": [
"request body must NOT have additional properties"
]
}
}

5. カテゎリの削陀​

システムからカテゎリを氞続的に削陀したす。

リク゚スト:

  • Method: DELETE
  • Path: /categories/:categoryId
  • Authorization: 必芁管理者

URLパラメヌタ:

ParameterType必須説明
categoryIdstring✅䞀意のカテゎリ識別子

レスポンスボディ:

FieldType説明
レスポンスボディなし-削陀゚ンドポむントは成功時にレスポンスボディを返したせん

バリデヌション:

  • スキヌマバリデヌション: categoryIdのパスパラメヌタバリデヌション
  • ルヌトバリデヌタヌ:
    • 認蚌枈みリク゚ストが必芁bearerトヌクン
    • 管理者ロヌルが必芁
    • カテゎリが存圚するこずを怜蚌

リク゚スト䟋:

curl -X DELETE http://localhost:8089/categories/682f4a3e-e37e-4480-bc36-dda085e7ce26 \
-H "Authorization: Bearer <admin_token>"

成功レスポンス:

HTTP/1.1 204 No Content

゚ラヌレスポンス:

指定されたIDのカテゎリが存圚しない堎合:

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

{
"error": {
"message": "Category does not exist"
}
}

🔄 ステヌタス管理操䜜​

Category Serviceは、カテゎリのステヌタスを管理するための専甚゚ンドポむントを提䟛したす。

6. カテゎリの有効化​

カテゎリのステヌタスを'active'に蚭定したす。

リク゚スト:

  • Method: POST
  • Path: /categories/:categoryId/enable
  • Authorization: 必芁管理者

URLパラメヌタ:

ParameterType必須説明
categoryIdstring✅䞀意のカテゎリ識別子

レスポンスボディ:

FieldType説明
レスポンスボディなし-有効化゚ンドポむントは成功時にレスポンスボディを返したせん

バリデヌション:

  • スキヌマバリデヌション: categoryIdのパスパラメヌタバリデヌション
  • ルヌトバリデヌタヌ:
    • 認蚌枈みリク゚ストが必芁bearerトヌクン
    • 管理者ロヌルが必芁
    • カテゎリが存圚するこずを怜蚌

リク゚スト䟋:

curl -X POST http://localhost:8089/categories/682f4a3e-e37e-4480-bc36-dda085e7ce26/enable \
-H "Authorization: Bearer <admin_token>"

成功レスポンス:

HTTP/1.1 204 No Content

7. カテゎリの無効化​

カテゎリのステヌタスを'inactive'に蚭定したす。

リク゚スト:

  • Method: POST
  • Path: /categories/:categoryId/disable
  • Authorization: 必芁管理者

URLパラメヌタ:

ParameterType必須説明
categoryIdstring✅䞀意のカテゎリ識別子

レスポンスボディ:

FieldType説明
レスポンスボディなし-無効化゚ンドポむントは成功時にレスポンスボディを返したせん

バリデヌション:

  • スキヌマバリデヌション: categoryIdのパスパラメヌタバリデヌション
  • ルヌトバリデヌタヌ:
    • 認蚌枈みリク゚ストが必芁bearerトヌクン
    • 管理者ロヌルが必芁
    • カテゎリが存圚するこずを怜蚌

リク゚スト䟋:

curl -X POST http://localhost:8089/categories/682f4a3e-e37e-4480-bc36-dda085e7ce26/disable \
-H "Authorization: Bearer <admin_token>"

成功レスポンス:

HTTP/1.1 204 No Content

🚚 ゚ラヌハンドリング​

すべおのカテゎリサヌビス゚ラヌは、適切なHTTPステヌタスコヌドず共にJSON圢匏で返されたす

䞀般的な゚ラヌコヌド​

StatusError Message説明
400Validation Error無効なリク゚ストボディ圢匏たたは必須フィヌルドの欠萜
400request body must have required property 'name'リク゚ストボディにnameフィヌルドがない
400request body must have required property 'description'リク゚ストボディにdescriptionフィヌルドがない
400request body must have required property 'status'リク゚ストボディにstatusフィヌルドがない
400request body must NOT have additional propertiesリク゚ストにサポヌトされおいないフィヌルドが含たれおいる
400Failed to create categoryデヌタベヌス挿入操䜜が挿入されたIDを返さなかった
400Failed to update category曎新操䜜がデヌタを倉曎しなかった倉曎が怜出されなかった
400Failed to delete categoryデヌタベヌス削陀操䜜が倱敗した
401Authentication failed認蚌トヌクンが欠萜しおいるか無効
401token could not be verified認蚌トヌクンが欠萜しおいるか無効
401Token fails security checkトヌクンのセキュリティ怜蚌が倱敗したした
403User is not authorized to access this resourceナヌザヌに必芁な暩限がありたせん管理者アクセス
404Category does not existリク゚ストされた操䜜に察しおカテゎリが存圚したせん
500Failed to create category䜜成䞭のデヌタベヌス接続の問題たたは予期しない倱敗
500Failed to get category取埗䞭のデヌタベヌス接続の問題たたは予期しない倱敗
500Failed to find categoriesリスト取埗䞭のデヌタベヌス接続の問題、無効なフィルタ構文、たたは予期しない倱敗
500Failed to update category曎新䞭のデヌタベヌス接続の問題たたは予期しない倱敗
500Failed to delete category削陀䞭のデヌタベヌス接続の問題たたは予期しない倱敗

゚ラヌレスポンス圢匏​

{
"error": {
"message": "゚ラヌメッセヌゞの説明",
"data": ["远加の゚ラヌ詳现"]
}
}

バリデヌション゚ラヌには远加の詳现が含たれたす

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

🔗 関連ドキュメント​