ðŠ ååãµãŒãã¹
Product Serviceã¯ãå æ¬çãªCRUDæäœãšåŒ·åãªãããåŠçæ©èœãåããååãšã³ãã£ãã£ã管çããããã®å®å šãªREST APIãæäŸããŸããNodeblocksã®é¢æ°åã³ã³ããžã·ã§ã³ã¢ãããŒãã䜿çšããŠæ§ç¯ãããMongoDBãšã·ãŒã ã¬ã¹ã«çµ±åãããŸãã
ð ã¯ã€ãã¯ã¹ã¿ãŒãâ
import express from 'express';
import { middlewares, services, drivers } from '@nodeblocks/backend-sdk';
const { nodeBlocksErrorMiddleware } = middlewares;
const { productService } = services;
const { withMongo, createFileStorageDriver } = drivers;
const connectToDatabase = withMongo('mongodb://localhost:27017', 'dev', 'user', 'password');
// Required for image upload URL endpoint:
// Ensure GOOGLE_APPLICATION_CREDENTIALS is set to your Google Cloud service account JSON.
const fileStorageDriver = createFileStorageDriver(
'your-gcp-project-id',
'your-bucket-name'
);
express()
.use(
productService(
{
...(await connectToDatabase('products')),
...(await connectToDatabase('identities')),
},
{
authSecrets: {
authEncSecret: 'your-encryption-secret',
authSignSecret: 'your-signing-secret',
},
identity: {
typeIds: {
admin: '100',
guest: '000',
regular: '001',
},
},
},
{ fileStorageDriver }
)
)
.use(nodeBlocksErrorMiddleware())
.listen(8089, () => console.log('Server running'));
ð ãšã³ããã€ã³ãæŠèŠâ
åå¥ååæäœâ
| Method | Path | 説æ | èªèšŒãå¿ èŠ |
|---|---|---|---|
POST | /products | æ°ããååãäœæ | â 管çè |
GET | /products/:productId | IDã§ååãååŸ | â |
GET | /products | ååããªã¹ã/ãã£ã«ã¿ | â |
GET | /products/organizations/:organizationId | çµç¹å¥ã«ååããªã¹ã | â çµç¹ã¡ã³ããŒä»¥äž |
GET | /products/:productId/likers | ååãããããããŠãŒã¶ãŒããªã¹ã | â 管çè |
PATCH | /products/:productId | ååãæŽæ° | â 管çè |
DELETE | /products/:productId | ååãåé€ | â 管çè |
POST | /products/:productId/copy | æ¢åã®ååãã³ã㌠| â 管çè |
ãã¡ã€ã«ã¢ããããŒãæäœâ
| Method | Path | 説æ | èªèšŒãå¿ èŠ |
|---|---|---|---|
GET | /products/:productId/image-upload-url | ååç»åãã¢ããããŒãããããã®çœ²åä»ãURLãååŸ | â 管çè |
POST | /products/:productId/images | ååç»åãšã³ããªãäœæ | â 管çè |
DELETE | /products/:productId/images/:imageId | ååç»åãåé€ | â 管çè |
ãããååæäœâ
| Method | Path | 説æ | èªèšŒãå¿ èŠ |
|---|---|---|---|
POST | /products/batch | è€æ°ã®ååãäœæ | â 管çè |
PATCH | /products/batch | è€æ°ã®ååãæŽæ° | â 管çè |
DELETE | /products/batch | è€æ°ã®ååãåé€ | â 管çè |
POST | /products/batch/copy | è€æ°ã®ååãã³ã㌠| â 管çè |
ååããªã¢ã³ãæäœâ
| Method | Path | 説æ | èªèšŒãå¿ èŠ |
|---|---|---|---|
POST | /products/:productId/variants | ååããªã¢ã³ããäœæ | â 管çè |
GET | /products/:productId/variants | ååã®ããªã¢ã³ãããªã¹ã | â |
GET | /products/:productId/variants/:productVariantId | ç¹å®ã®ããªã¢ã³ããååŸ | â |
PATCH | /products/:productId/variants/:productVariantId | ååããªã¢ã³ããæŽæ° | â 管çè |
DELETE | /products/:productId/variants/:productVariantId | ååããªã¢ã³ããåé€ | â 管çè |
POST | /product/:productId/variants/bulk | è€æ°ã®ããªã¢ã³ããäœæ | â 管çè |
PATCH | /product/:productId/variants/bulk | è€æ°ã®ããªã¢ã³ããæŽæ° | â 管çè |
POST | /product/:productId/variants/bulk-delete | è€æ°ã®ããªã¢ã³ããåé€ | â 管çè |
ðïž ãšã³ãã£ãã£ã¹ããŒãâ
ååãšã³ãã£ãã£ã¯ãåºæ¬ãã£ãŒã«ãïŒèªåçæïŒãšç»åãå«ãåååºæã®ããŒã¿ãçµã¿åãããŸãïŒ
{
"name": "string",
"description": "string",
"images": [
{
"objectId": "string (uuid)",
"type": "string",
"id": "string (uuid)",
"createdAt": "string (datetime)",
"updatedAt": "string (datetime)"
}
],
"createdAt": "string (datetime)",
"id": "string (uuid)",
"updatedAt": "string (datetime)"
}
ãã£ãŒã«ã詳现â
| Field | Type | èªåçæ | å¿ é | 説æ |
|---|---|---|---|---|
name | string | â | â | ååå |
description | string | â | â | ååã®èª¬æ |
images | array | Partial | â | ååç»åã®é å |
images[].objectId | string (uuid) | â | â | ç»åãã¡ã€ã«ã®ãªããžã§ã¯ãèå¥å |
images[].type | string | â | â | ç»åã®MIMEã¿ã€ãïŒäŸïŒ'image/png'ïŒ |
images[].id | string (uuid) | â | â | ç»åãšã³ãã£ãã£ã®äžæã®èå¥å |
images[].createdAt | datetime | â | â | ç»åäœæã¿ã€ã ã¹ã¿ã³ã |
images[].updatedAt | datetime | â | â | ç»åæçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
createdAt | datetime | â | â | ååäœæã¿ã€ã ã¹ã¿ã³ã |
id | string (uuid) | â | â | äžæã®ååèå¥åïŒUUIDïŒ |
updatedAt | datetime | â | â | ååæçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ð æ³šèš:
- èªåçæãã£ãŒã«ãã¯ãµãŒãã¹ã«ãã£ãŠèšå®ãããäœæ/æŽæ°ãªã¯ãšã¹ãã«å«ããã¹ãã§ã¯ãããŸãã
imagesé åå ã®åç»åã¯ãç¬èªã®åºæ¬ãšã³ãã£ãã£ãã£ãŒã«ãïŒidãcreatedAtãupdatedAtïŒãååŸããŸã- åç»åã®
objectIdã¯ãã¹ãã¬ãŒãžå ã®å®éã®ç»åãã¡ã€ã«ãåç §ããŸã- ã¬ã¹ãã³ã¹å ã®ãã£ãŒã«ãé åºã¯ãå®éã®APIåºåãšäžèŽããŸã
ð èªèšŒããããŒâ
ä¿è·ããããšã³ããã€ã³ãã§ã¯ã次ã®ããããŒãå«ããŠãã ããïŒ
Authorization: Bearer <admin_access_token>
x-nb-fingerprint: <device_fingerprint>
â ïž éèŠ:
x-nb-fingerprintããããŒã¯ãèªèšŒæã«ãã£ã³ã¬ãŒããªã³ããæå®ãããå Žåããã¹ãŠã®èªèšŒæžã¿ãªã¯ãšã¹ãã§å¿ é ã§ããããããªãå Žåããªã¯ãšã¹ãã¯401 Unauthorizedãè¿ããŸãã
ð§ APIãšã³ããã€ã³ãâ
1. ååã®äœæâ
æäŸãããæ å ±ã§æ°ããååãäœæããŸãã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/products - Headers:
Content-Type: application/json,Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
ãªã¯ãšã¹ãããã£:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
name | string | â | ååå |
description | string | â | ååã®èª¬æ |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ååèå¥å |
name | string | ååå |
description | string | ååã®èª¬æ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: èªåçã«åŒ·å¶ãããŸãïŒnameãdescriptionå¿ é ïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X POST {{host}}/products \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"name": "Premium Widget",
"description": "High-quality widget for enterprise use"
}'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"name": "Premium Widget",
"description": "High-quality widget for enterprise use",
"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 'name'",
"request body must have required property 'description'"
]
}
}
ããŒã¿ããŒã¹æ¿å ¥æäœã倱æããå Žå:
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"error": {
"message": "Failed to create product"
}
}
2. IDã§ååãååŸâ
äžæã®IDã§ç¹å®ã®ååãååŸããŸãã
ãªã¯ãšã¹ã:
- Method:
GET - Path:
/products/:productId - Authorization: äžèŠ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | äžæã®ååèå¥å |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ååèå¥å |
name | string | ååå |
description | string | ååã®èª¬æ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãã¹ãã©ã¡ãŒã¿ããªããŒã·ã§ã³ïŒproductIdå¿ é ïŒ
- ã«ãŒãããªããŒã¿ãŒ: ãªã
ãªã¯ãšã¹ãäŸ:
curl {{host}}/products/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"name": "Premium Widget",
"description": "High-quality widget for enterprise use",
"createdAt": "2024-05-28T09:41:22.552Z",
"updatedAt": "2024-05-28T09:41:22.552Z"
}
ãšã©ãŒã¬ã¹ãã³ã¹:
æå®ãããIDã®ååãååšããªãå Žå:
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"message": "Product not found"
}
}
3. ååã®ãªã¹ãååŸâ
ãªãã·ã§ã³ã®ãã£ã«ã¿ãªã³ã°ãšããŒãžããŒã·ã§ã³ä»ãã§ååã®ãªã¹ããååŸããŸãã
ãªã¯ãšã¹ã:
- Method:
GET - Path:
/products - Authorization: äžèŠ
ã¯ãšãªãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
name | string | â | åååã§ãã£ã«ã¿ |
description | string | â | ååã®èª¬æã§ãã£ã«ã¿ |
page | number | â | ããŒãžããŒã·ã§ã³ã®ããŒãžçªå·ïŒ1-1000ïŒ |
limit | number | â | ããŒãžãããã®é ç®æ°ïŒ1-50ïŒ |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ååèå¥å |
name | string | ååå |
description | string | ååã®èª¬æ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ã¯ãšãªãã©ã¡ãŒã¿ããªããŒã·ã§ã³ïŒãªãã·ã§ã³ã®nameãdescriptionãpageãlimitïŒ
- ã«ãŒãããªããŒã¿ãŒ: ãªã
ãªã¯ãšã¹ãäŸ:
ãã¹ãŠã®ååããªã¹ã:
curl {{host}}/products
ååã§ãã£ã«ã¿:
curl "{{host}}/products?name=Premium%20Widget"
ããŒãžããŒã·ã§ã³ä»ã:
curl "{{host}}/products?page=1&limit=10"
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"name": "Premium Widget",
"description": "Updated high-quality widget for enterprise use",
"createdAt": "2025-06-24T06:39:17.101Z",
"id": "3d0e4b74-398c-43e2-a7b4-c9a180477322",
"updatedAt": "2025-06-24T06:39:17.101Z"
},
{
"name": "Product A",
"description": "Updated batch description",
"createdAt": "2025-06-24T06:39:45.378Z",
"id": "0e0dd6c7-c3d5-49e5-a1d8-20daa34d380a",
"updatedAt": "2025-06-24T06:39:55.720Z"
},
{
"name": "Product B",
"description": "Updated batch description",
"createdAt": "2025-06-24T06:39:45.378Z",
"id": "d5a60fdf-2a22-4fcc-8e40-a68cb89cce72",
"updatedAt": "2025-06-24T06:39:55.720Z"
}
]
4. çµç¹IDå¥ã«ååããªã¹ãååŸâ
ç¹å®ã®çµç¹ã«ã¹ã³ãŒããããååã®ãªã¹ãããããŒãžããŒã·ã§ã³ãšç»åæ£èŠåä»ãã§ååŸããŸãã
ãªã¯ãšã¹ã:
- Method:
GET - Path:
/products/organizations/:organizationId - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒçµç¹ã¡ã³ããŒã管çè ããŸãã¯ãªãŒããŒïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
organizationId | string | â | ååååŸãã¹ã³ãŒãããçµç¹èå¥å |
ã¯ãšãªãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
page | number | â | ããŒãžããŒã·ã§ã³ã®ããŒãžçªå·ïŒ1-1000ïŒ |
limit | number | â | ããŒãžãããã®é ç®æ°ïŒ1-50ïŒ |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
data | array | ååãªããžã§ã¯ãã®é å |
data[].id | string | äžæã®ååèå¥å |
data[].organizationId | string | çµç¹èå¥å |
data[].name | string | ååå |
data[].description | string | ååã®èª¬æ |
data[].images | array | URLä»ãã®ååç»åã®é å |
data[].createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
data[].updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
metadata | object | ããŒãžããŒã·ã§ã³ã¡ã¿ããŒã¿ |
metadata.pagination | object | ããŒãžããŒã·ã§ã³æ å ± |
metadata.pagination.page | number | çŸåšã®ããŒãžçªå· |
metadata.pagination.limit | number | ããŒãžãããã®é ç®æ° |
metadata.pagination.total | number | ååã®ç·æ° |
metadata.pagination.totalPages | number | ç·ããŒãžæ° |
metadata.pagination.hasNext | boolean | 次ã®ããŒãžããããã©ãã |
metadata.pagination.hasPrev | boolean | åã®ããŒãžããããã©ãã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: çµç¹IDãã¹ãã©ã¡ãŒã¿ãšããŒãžããŒã·ã§ã³ã¯ãšãªãã©ã¡ãŒã¿
- ã«ãŒãããªããŒã¿ãŒ: èªèšŒãå¿ èŠãçµç¹ã¡ã³ããŒã·ããã®æ€èšŒ
- Authorization: ãŠãŒã¶ãŒã¯çµç¹ã®ã¡ã³ããŒã管çè ããŸãã¯ãªãŒããŒã§ããå¿ èŠããããŸã
ãªã¯ãšã¹ãäŸ:
çµç¹ã®ååããªã¹ã:
curl -H "Authorization: Bearer eyJ..." "{{host}}/products/organizations/org-123"
ããŒãžããŒã·ã§ã³ä»ã:
curl -H "Authorization: Bearer eyJ..." "{{host}}/products/organizations/org-123?page=1&limit=5"
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": [
{
"id": "prod-123",
"organizationId": "org-456",
"name": "Premium Widget",
"description": "High-quality widget for professionals",
"images": [
{
"id": "img-789",
"objectId": "abc123...",
"type": "image/jpeg",
"url": "https://storage.googleapis.com/bucket/abc123..."
}
],
"createdAt": "2024-01-15T10:30:00Z",
"updatedAt": "2024-01-15T10:30:00Z"
}
],
"metadata": {
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"totalPages": 3,
"hasNext": true,
"hasPrev": false
}
}
}
ãšã©ãŒã¬ã¹ãã³ã¹:
401 Unauthorized: èªèšŒå€±æ403 Forbidden: ãŠãŒã¶ãŒãçµç¹ã«ã¢ã¯ã»ã¹ã§ããªã500 Internal Server Error: ããŒã¿ããŒã¹æäœå€±æãŸãã¯ãã¡ã€ã«ã¹ãã¬ãŒãžãšã©ãŒ
ãŠãŒã¹ã±ãŒã¹:
- ãã«ãããã³ãã¢ããªã±ãŒã·ã§ã³ã§ã®çµç¹åºæã®ååã«ã¿ãã°
- çµç¹å ã®ååã管çãã管çããã·ã¥ããŒã
- ç¹å®ã®ããžãã¹ãšã³ãã£ãã£ã®ååãååŸããAPIã³ã³ã·ã¥ãŒããŒ
5. ååã®ããããŠãŒã¶ãŒããªã¹ãååŸâ
ç¹å®ã®ååãããããããŠãŒã¶ãŒã®ãªã¹ãããããŒãžããŒã·ã§ã³ãšã¢ãã¿ãŒæ£èŠåä»ãã§ååŸããŸãã
ãªã¯ãšã¹ã:
- Method:
GET - Path:
/products/:productId/likers - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ã®ã¿ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | ããããŠãŒã¶ãŒãååŸããååèå¥å |
ã¯ãšãªãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
page | number | â | ããŒãžããŒã·ã§ã³ã®ããŒãžçªå·ïŒ1-1000ïŒ |
limit | number | â | ããŒãžãããã®é ç®æ°ïŒ1-50ïŒ |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
data | array | ååãããããããŠãŒã¶ãŒãªããžã§ã¯ãã®é å |
data[].id | string | ãŠãŒã¶ãŒèå¥å |
data[].name | string | ãŠãŒã¶ãŒè¡šç€ºå |
data[].avatar | object | 眲åä»ãURLä»ãã®ãŠãŒã¶ãŒã¢ãã¿ãŒ |
data[].avatar.id | string | ã¢ãã¿ãŒãã¡ã€ã«èå¥å |
data[].avatar.objectId | string | ã¯ã©ãŠãã¹ãã¬ãŒãžãªããžã§ã¯ãèå¥å |
data[].avatar.type | string | ã¢ãã¿ãŒç»åã®MIMEã¿ã€ã |
data[].avatar.url | string | ã¢ãã¿ãŒã¢ã¯ã»ã¹çšã®çœ²åä»ãURL |
metadata | object | ããŒãžããŒã·ã§ã³ã¡ã¿ããŒã¿ |
metadata.pagination | object | ããŒãžããŒã·ã§ã³æ å ± |
metadata.pagination.page | number | çŸåšã®ããŒãžçªå· |
metadata.pagination.limit | number | ããŒãžãããã®é ç®æ° |
metadata.pagination.total | number | ããããŠãŒã¶ãŒã®ç·æ° |
metadata.pagination.totalPages | number | ç·ããŒãžæ° |
metadata.pagination.hasNext | boolean | 次ã®ããŒãžããããã©ãã |
metadata.pagination.hasPrev | boolean | åã®ããŒãžããããã©ãã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ååIDãã¹ãã©ã¡ãŒã¿ãšããŒãžããŒã·ã§ã³ã¯ãšãªãã©ã¡ãŒã¿
- ã«ãŒãããªããŒã¿ãŒ: èªèšŒãå¿ èŠã管çè å°çšã®èªå¯
- Authorization: ãŠãŒã¶ãŒã¯ç®¡çè ããŒã«ãæã£ãŠããå¿ èŠããããŸã
ãªã¯ãšã¹ãäŸ:
ååã®ããããŠãŒã¶ãŒããªã¹ã:
curl -H "Authorization: Bearer eyJ..." "{{host}}/products/prod-123/likers"
ããŒãžããŒã·ã§ã³ä»ã:
curl -H "Authorization: Bearer eyJ..." "{{host}}/products/prod-123/likers?page=1&limit=5"
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": [
{
"id": "user-123",
"name": "John Doe",
"avatar": {
"id": "avatar-456",
"objectId": "abc123...",
"type": "image/jpeg",
"url": "https://storage.googleapis.com/bucket/abc123..."
}
}
],
"metadata": {
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"totalPages": 3,
"hasNext": true,
"hasPrev": false
}
}
}
ãšã©ãŒã¬ã¹ãã³ã¹:
401 Unauthorized: èªèšŒå€±æ403 Forbidden: é管çè ãŠãŒã¶ãŒãããããŠãŒã¶ãŒã衚瀺ããããšãã404 Not Found: ååãèŠã€ãããªã500 Internal Server Error: ããŒã¿ããŒã¹æäœå€±æãŸãã¯ãã¡ã€ã«ã¹ãã¬ãŒãžãšã©ãŒ
ãŠãŒã¹ã±ãŒã¹:
- ååãšã³ã²ãŒãžã¡ã³ãã¡ããªã¯ã¹ã衚瀺ãã管çããã·ã¥ããŒã
- ååãããããããŠãŒã¶ãŒã衚瀺ãããœãŒã·ã£ã«æ©èœ
- ååã®äººæ°ã«é¢ããåæãšã¬ããŒã
- ã¬ã³ã¡ã³ããŒã·ã§ã³ã·ã¹ãã ã®ããã®ãŠãŒã¶ãŒé¢ä¿åæ
6. ååã®æŽæ°â
éšåçãªããŒã¿ã§æ¢åã®ååãæŽæ°ããŸãã
ãªã¯ãšã¹ã:
- Method:
PATCH - Path:
/products/:productId - Headers:
Content-Type: application/json,Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | äžæã®ååèå¥å |
ãªã¯ãšã¹ãããã£ïŒãã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ïŒ:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
name | string | â | ååå |
description | string | â | ååã®èª¬æ |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ååèå¥å |
name | string | æŽæ°ãããååå |
description | string | æŽæ°ãããååã®èª¬æ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: èªåçã«åŒ·å¶ãããŸãïŒéšåæŽæ°ããã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ã远å ããããã£ã¯èš±å¯ãããŸããïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X PATCH {{host}}/products/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{"description": "Updated high-quality widget for enterprise use"}'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"name": "Premium Widget",
"description": "Updated high-quality widget for enterprise use",
"createdAt": "2024-05-28T09:41:22.552Z",
"updatedAt": "2024-05-28T14:22:15.789Z"
}
ãšã©ãŒã¬ã¹ãã³ã¹:
æå®ãããIDã®ååãååšããªãå Žå:
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"message": "Product not found"
}
}
7. ååã®åé€â
ã·ã¹ãã ããååãæ°žç¶çã«åé€ããŸãã
ãªã¯ãšã¹ã:
- Method:
DELETE - Path:
/products/:productId - Headers:
Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | äžæã®ååèå¥å |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
| ã¬ã¹ãã³ã¹ããã£ãªã | - | åé€ãšã³ããã€ã³ãã¯æåæã«ã¬ã¹ãã³ã¹ããã£ãè¿ããŸãã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãã¹ãã©ã¡ãŒã¿ããªããŒã·ã§ã³ïŒproductIdå¿ é ïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X DELETE {{host}}/products/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": "Product not found"
}
}
8. ååã®ã³ããŒâ
æ°ããIDã§æ¢åã®ååã®ã³ããŒãäœæããŸãã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/products/:productId/copy - Headers:
Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | ã³ããŒããååã®ID |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | ã³ããŒãããååã®äžæã®èå¥å |
name | string | åååïŒå ããã³ããŒïŒ |
description | string | ååã®èª¬æïŒå ããã³ããŒïŒ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãã¹ãã©ã¡ãŒã¿ããªããŒã·ã§ã³ïŒproductIdå¿ é ïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X POST {{host}}/products/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/copy \
-H "Authorization: Bearer <access-token>"
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "9abc123f-1cd8-4def-b123-456789abcdef",
"name": "Premium Widget",
"description": "High-quality widget for enterprise use",
"createdAt": "2024-05-28T15:30:45.123Z",
"updatedAt": "2024-05-28T15:30:45.123Z"
}
ãšã©ãŒã¬ã¹ãã³ã¹:
æå®ãããIDã®ååãååšããªãå Žå:
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"message": "Product not found"
}
}
ð ãããååæäœâ
Product Serviceã¯ãè€æ°ã®ååãå¹ççã«ç®¡çããããã®åŒ·åãªãããæäœãæäŸããŸãã
9. è€æ°ã®ååãäœæâ
åäžã®ãªã¯ãšã¹ãã§è€æ°ã®ååãäœæããŸãã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/products/batch - Headers:
Content-Type: application/json,Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
ãªã¯ãšã¹ãããã£:
ååãªããžã§ã¯ãã®é
åãåãªããžã§ã¯ãã«ã¯nameãšdescriptionãå¿
èŠã§ãã
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ååèå¥å |
name | string | ååå |
description | string | ååã®èª¬æ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: èªåçã«åŒ·å¶ãããŸãïŒnameãšdescriptionãå¿ é ã®ååãªããžã§ã¯ãã®é åïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X POST {{host}}/products/batch \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '[
{
"name": "Product A",
"description": "Description for Product A"
},
{
"name": "Product B",
"description": "Description for Product B"
}
]'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"name": "Product A",
"description": "Description for Product A",
"createdAt": "2025-06-24T06:39:45.378Z",
"id": "0e0dd6c7-c3d5-49e5-a1d8-20daa34d380a",
"updatedAt": "2025-06-24T06:39:45.378Z"
},
{
"name": "Product B",
"description": "Description for Product B",
"createdAt": "2025-06-24T06:39:45.378Z",
"id": "d5a60fdf-2a22-4fcc-8e40-a68cb89cce72",
"updatedAt": "2025-06-24T06:39:45.378Z"
}
]
10. è€æ°ã®ååãæŽæ°â
åäžã®ãªã¯ãšã¹ãã§åãããŒã¿ã§è€æ°ã®ååãæŽæ°ããŸãã
ãªã¯ãšã¹ã:
- Method:
PATCH - Path:
/products/batch - Headers:
Content-Type: application/json,Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
ãªã¯ãšã¹ãããã£:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
ids | array of strings | â | æŽæ°ããååIDã®é å |
data | object | â | ãã¹ãŠã®ååã«é©çšããæŽæ°ããŒã¿ |
data.name | string | â | æ°ããååå |
data.description | string | â | æ°ããååã®èª¬æ |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ååèå¥å |
name | string | æŽæ°ãããååå |
description | string | æŽæ°ãããååã®èª¬æ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: èªåçã«åŒ·å¶ãããŸãïŒidsé åãšdataãªããžã§ã¯ããå¿ é ïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X PATCH {{host}}/products/batch \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"ids": [
"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"8fec096b-1bc7-5bfe-c827-3600e8fe2790"
],
"data": {
"description": "Updated batch description"
}
}'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"id": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"name": "Product A",
"description": "Updated batch description",
"createdAt": "2024-05-28T09:41:22.552Z",
"updatedAt": "2024-05-28T15:45:12.789Z"
},
{
"id": "8fec096b-1bc7-5bfe-c827-3600e8fe2790",
"name": "Product B",
"description": "Updated batch description",
"createdAt": "2024-05-28T09:41:23.123Z",
"updatedAt": "2024-05-28T15:45:12.789Z"
}
]
11. è€æ°ã®ååãåé€â
åäžã®ãªã¯ãšã¹ãã§è€æ°ã®ååãåé€ããŸãã
ãªã¯ãšã¹ã:
- Method:
DELETE - Path:
/products/batch - Headers:
Content-Type: application/json,Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
ãªã¯ãšã¹ãããã£: åé€ããååIDã®é åã
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
| ã¬ã¹ãã³ã¹ããã£ãªã | - | åé€ãšã³ããã€ã³ãã¯æåæã«ã¬ã¹ãã³ã¹ããã£ãè¿ããŸãã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: èªåçã«åŒ·å¶ãããŸãïŒæååã®é åïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X DELETE {{host}}/products/batch \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '[
"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"8fec096b-1bc7-5bfe-c827-3600e8fe2790"
]'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 204 No Content
12. è€æ°ã®ååãã³ããŒâ
åäžã®ãªã¯ãšã¹ãã§è€æ°ã®ååã®ã³ããŒãäœæããŸãã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/products/batch/copy - Headers:
Content-Type: application/json,Authorization: Bearer <access-token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
ãªã¯ãšã¹ãããã£: ã³ããŒããååIDã®é åã
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | ã³ããŒãããååã®äžæã®èå¥å |
name | string | åååïŒå ããã³ããŒïŒ |
description | string | ååã®èª¬æïŒå ããã³ããŒïŒ |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: èªåçã«åŒ·å¶ãããŸãïŒæååã®é åïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X POST {{host}}/products/batch/copy \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '[
"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"8fec096b-1bc7-5bfe-c827-3600e8fe2790"
]'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"id": "9abc123f-1cd8-4def-b123-456789abcdef",
"name": "Product A",
"description": "Description for Product A",
"createdAt": "2024-05-28T16:00:00.000Z",
"updatedAt": "2024-05-28T16:00:00.000Z"
},
{
"id": "def456a1-2e3f-4567-8901-23456789bcde",
"name": "Product B",
"description": "Description for Product B",
"createdAt": "2024-05-28T16:00:00.100Z",
"updatedAt": "2024-05-28T16:00:00.100Z"
}
]
13. ååç»åã¢ããããŒãURLãååŸâ
ååç»åãå®å šã«ã¢ããããŒãããããã®äºå眲åä»ãURLãçæããŸãããªããžã§ã¯ãIDãšäžæçãªçœ²åä»ãURLãè¿ããŸãã
ãªã¯ãšã¹ã:
- Method:
GET - Path:
/products/:productId/image-upload-url - Headers:
Authorization: Bearer <token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 察象ååID |
ã¯ãšãªãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
contentType | string | â | ç»åã®MIMEã¿ã€ãïŒäŸïŒimage/pngïŒ |
contentLength | number | â | ãã€ãåäœã®ãã¡ã€ã«ãµã€ãºïŒæå€§10MBïŒ |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
objectId | string | ååç»åçšã«çæãããã¹ãã¬ãŒãžãªããžã§ã¯ãID |
url | string | ãã¡ã€ã«ãã¢ããããŒãããããã®äºå眲åä»ãURL |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ç»åã¢ããããŒãã¹ããŒãã䜿çšïŒã³ã³ãã³ãã¿ã€ããšãµã€ãºå¶çŽïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl "{{host}}/products/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/image-upload-url?contentType=image/webp&contentLength=2097152" \
-H "Authorization: Bearer <access-token>"
æåã¬ã¹ãã³ã¹:
{
"objectId": "7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2",
"url": "https://storage.googleapis.com/bucket/products/...&X-Goog-Expires=900&X-Goog-Signature=..."
}
14. ååç»åãäœæâ
ãã¡ã€ã«ãã¯ã©ãŠãã¹ãã¬ãŒãžã«ã¢ããããŒãããåŸãååç»åãšã³ããªãäœæããŸãã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/products/:productId/images - Headers:
Content-Type: application/jsonAuthorization: Bearer <token>
- Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 察象ååID |
ãªã¯ãšã¹ãããã£:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
objectId | string | â | ã¢ããããŒãURLããã®ã¹ãã¬ãŒãžãªããžã§ã¯ãID |
type | string | â | ç»åã¿ã€ã/ã«ããŽãª |
ãªã¯ãšã¹ãäŸ:
curl -X POST "{{host}}/products/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/images" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"objectId": "image-uuid-123",
"type": "product-image"
}'
15. ååç»åãåé€â
ååç»åãåé€ããã¯ã©ãŠãã¹ãã¬ãŒãžãããã¡ã€ã«ãåé€ããŸãã
ãªã¯ãšã¹ã:
- Method:
DELETE - Path:
/products/:productId/images/:imageId - Headers:
Authorization: Bearer <token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 察象ååID |
imageId | string | â | åé€ããç»åID |
ãªã¯ãšã¹ãäŸ:
curl -X DELETE "{{host}}/products/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/images/image-uuid-123" \
-H "Authorization: Bearer <access-token>"
16. ååããªã¢ã³ããäœæâ
æ¢åã®ååã®æ°ããããªã¢ã³ããäœæããŸãã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/products/:productId/variants - Headers:
Content-Type: application/jsonAuthorization: Bearer <token>
- Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
ãªã¯ãšã¹ãããã£:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
title | string | â | ååããªã¢ã³ãã¿ã€ãã« |
description | string | â | ããªã¢ã³ãã®èª¬æ |
sku | string | â | åšåº«ç®¡çåäœèå¥å |
imageIds | array of strings | â | ããªã¢ã³ãã«é¢é£ä»ããããç»åèå¥åã®é å |
price | object | â | äŸ¡æ Œè©³çŽ°ïŒä»¥äžãåç §ïŒ |
äŸ¡æ Œãªããžã§ã¯ã:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
amount | number | â | äŸ¡æ Œé¡ |
currency | string | â | ISOé貚ã³ãŒã |
taxIncluded | boolean | â | éé¡ã«çšéãå«ãŸããŠãããã©ãã |
taxable | boolean | â | ããªã¢ã³ãã課çšå¯Ÿè±¡ãã©ãã |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ããªã¢ã³ãèå¥å |
productId | string | 芪ååID |
title | string | ããªã¢ã³ãã¿ã€ãã« |
description | string | ããªã¢ã³ãã®èª¬æ |
sku | string | åšåº«ç®¡çåäœ |
imageIds | array | ç»åIDã®é å |
price | object | äŸ¡æ Œæ å ± |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãªã¯ãšã¹ãããã£ã«ã¯
titleãå¿ èŠããã®ä»ã®ãã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ - ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X POST "{{host}}/products/product-123/variants" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"title": "Large Size",
"description": "Large variant of the product",
"sku": "PROD-LG-001",
"price": {
"amount": 29.99,
"currency": "USD",
"taxIncluded": false,
"taxable": true
}
}'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": "variant-456",
"productId": "product-123",
"title": "Large Size",
"description": "Large variant of the product",
"sku": "PROD-LG-001",
"price": {
"amount": 29.99,
"currency": "USD",
"taxIncluded": false,
"taxable": true
},
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:30:00.000Z"
}
17. ååããªã¢ã³ãããªã¹ãååŸâ
ç¹å®ã®ååã®ãã¹ãŠã®ããªã¢ã³ããããŒãžããŒã·ã§ã³ä»ãã§ååŸããŸãã
ãªã¯ãšã¹ã:
- Method:
GET - Path:
/products/:productId/variants - Authorization: äžèŠ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
ã¯ãšãªãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
page | number | â | ããŒãžããŒã·ã§ã³ã®ããŒãžçªå·ïŒ1-1000ïŒ |
limit | number | â | ããŒãžãããã®çµææ°ïŒ1-50ïŒ |
ã¬ã¹ãã³ã¹ããã£: ããªã¢ã³ãé åãšã¡ã¿ããŒã¿ãå«ãããŒãžããŒã·ã§ã³ä»ãã¬ã¹ãã³ã¹ã
ã¬ã¹ãã³ã¹æ§é :
{
"data": [
{
"id": "string",
"productId": "string",
"title": "string",
"description": "string",
"sku": "string",
"imageIds": ["string"],
"price": {
"amount": number,
"currency": "string",
"taxIncluded": boolean,
"taxable": boolean
},
"createdAt": "string",
"updatedAt": "string"
}
],
"metadata": {
"pagination": {
"page": number,
"limit": number,
"total": number,
"totalPages": number,
"hasNext": boolean,
"hasPrev": boolean
}
}
}
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãã¹ãã©ã¡ãŒã¿ããªããŒã·ã§ã³ãšããŒãžããŒã·ã§ã³ã¯ãšãªãã©ã¡ãŒã¿
- ã«ãŒãããªããŒã¿ãŒ: ãªã
ãªã¯ãšã¹ãäŸ:
curl "{{host}}/products/product-123/variants?page=1&limit=20"
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": [
{
"id": "variant-456",
"productId": "product-123",
"title": "Large Size",
"description": "Large variant",
"sku": "PROD-LG-001",
"imageIds": [],
"price": {
"amount": 29.99,
"currency": "USD",
"taxIncluded": false,
"taxable": true
},
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:30:00.000Z"
}
],
"metadata": {
"pagination": {
"page": 1,
"limit": 20,
"total": 5,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}
}
18. ååããªã¢ã³ããååŸâ
IDã§ç¹å®ã®ååããªã¢ã³ããååŸããŸãã
ãªã¯ãšã¹ã:
- Method:
GET - Path:
/products/:productId/variants/:productVariantId - Headers:
Authorization: Bearer <token> - Authorization: BearerããŒã¯ã³ãå¿ èŠ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
productVariantId | string | â | ããªã¢ã³ãID |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ããªã¢ã³ãèå¥å |
productId | string | 芪ååID |
title | string | ããªã¢ã³ãã¿ã€ãã« |
description | string | ããªã¢ã³ãã®èª¬æ |
sku | string | åšåº«ç®¡çåäœ |
imageIds | array | ç»åIDã®é å |
price | object | äŸ¡æ Œæ å ± |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãã¹ãã©ã¡ãŒã¿ããªããŒã·ã§ã³ïŒproductIdãšproductVariantIdãå¿ é ïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
ãªã¯ãšã¹ãäŸ:
curl "{{host}}/products/product-123/variants/variant-456" \
-H "Authorization: Bearer <access-token>"
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "variant-456",
"productId": "product-123",
"title": "Large Size",
"description": "Large variant of the product",
"sku": "PROD-LG-001",
"imageIds": [],
"price": {
"amount": 29.99,
"currency": "USD",
"taxIncluded": false,
"taxable": true
},
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:30:00.000Z"
}
ãšã©ãŒã¬ã¹ãã³ã¹:
401 Unauthorized: èªèšŒå€±æ404 Not Found: ååããªã¢ã³ããèŠã€ãããªã500 Internal Server Error: ããŒã¿ããŒã¹æäœå€±æ
19. ååããªã¢ã³ããæŽæ°â
éšåçãªããŒã¿ã§æ¢åã®ååããªã¢ã³ããæŽæ°ããŸãã
ãªã¯ãšã¹ã:
- Method:
PATCH - Path:
/products/:productId/variants/:productVariantId - Headers:
Content-Type: application/jsonAuthorization: Bearer <token>
- Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
productVariantId | string | â | æŽæ°ããããªã¢ã³ãID |
ãªã¯ãšã¹ãããã£ïŒãã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ïŒ:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
title | string | â | ååããªã¢ã³ãã¿ã€ãã« |
description | string | â | ããªã¢ã³ãã®èª¬æ |
sku | string | â | åšåº«ç®¡çåäœèå¥å |
imageIds | array of strings | â | ããªã¢ã³ãã«é¢é£ä»ããããç»åèå¥åã®é å |
price | object | â | äŸ¡æ Œè©³çŽ°ïŒä»¥äžãåç §ïŒ |
äŸ¡æ Œãªããžã§ã¯ãïŒãã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ïŒ:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
amount | number | â | äŸ¡æ Œé¡ |
currency | string | â | ISOé貚ã³ãŒã |
taxIncluded | boolean | â | éé¡ã«çšéãå«ãŸããŠãããã©ãã |
taxable | boolean | â | ããªã¢ã³ãã課çšå¯Ÿè±¡ãã©ãã |
ã¬ã¹ãã³ã¹ããã£:
| Field | Type | 説æ |
|---|---|---|
id | string | äžæã®ããªã¢ã³ãèå¥å |
productId | string | 芪ååID |
title | string | æŽæ°ãããããªã¢ã³ãã¿ã€ãã« |
description | string | æŽæ°ãããããªã¢ã³ãã®èª¬æ |
sku | string | æŽæ°ãããåšåº«ç®¡çåäœ |
imageIds | array | æŽæ°ãããç»åIDã®é å |
price | object | æŽæ°ãããäŸ¡æ Œæ å ± |
createdAt | string | äœæã¿ã€ã ã¹ã¿ã³ã |
updatedAt | string | æçµæŽæ°ã¿ã€ã ã¹ã¿ã³ã |
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ã远å ããããã£ã¯èš±å¯ãããŸãã
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X PATCH "{{host}}/products/product-123/variants/variant-456" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"price": {
"amount": 34.99,
"currency": "USD"
}
}'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "variant-456",
"productId": "product-123",
"title": "Large Size",
"description": "Large variant of the product",
"sku": "PROD-LG-001",
"imageIds": [],
"price": {
"amount": 34.99,
"currency": "USD",
"taxIncluded": false,
"taxable": true
},
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T14:22:15.789Z"
}
ãšã©ãŒã¬ã¹ãã³ã¹:
401 Unauthorized: èªèšŒå€±æ403 Forbidden: é管çè ãŠãŒã¶ãŒãããªã¢ã³ããæŽæ°ããããšãã404 Not Found: ååããªã¢ã³ããèŠã€ãããªã500 Internal Server Error: ããŒã¿ããŒã¹æäœå€±æ
20. ååããªã¢ã³ããåé€â
ååããªã¢ã³ããåé€ããŸãã
ãªã¯ãšã¹ã:
- Method:
DELETE - Path:
/products/:productId/variants/:productVariantId - Headers:
Authorization: Bearer <token> - Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
productVariantId | string | â | åé€ããããªã¢ã³ãID |
ã¬ã¹ãã³ã¹ããã£: ã¬ã¹ãã³ã¹ããã£ãªãïŒ204 No ContentïŒ
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ãã¹ãã©ã¡ãŒã¿ããªããŒã·ã§ã³ïŒproductIdãšproductVariantIdãå¿ é ïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X DELETE "{{host}}/products/product-123/variants/variant-456" \
-H "Authorization: Bearer <access-token>"
æåã¬ã¹ãã³ã¹:
HTTP/1.1 204 No Content
ãšã©ãŒã¬ã¹ãã³ã¹:
401 Unauthorized: èªèšŒå€±æ403 Forbidden: é管çè ãŠãŒã¶ãŒãããªã¢ã³ããåé€ããããšãã500 Internal Server Error: ããŒã¿ããŒã¹æäœå€±æ
21. ååããªã¢ã³ããäžæ¬äœæâ
äžåºŠã«è€æ°ã®ååããªã¢ã³ããäœæããŸãïŒãªã¯ãšã¹ãããã1-100ããªã¢ã³ãïŒã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/product/:productId/variants/bulk - Headers:
Content-Type: application/jsonAuthorization: Bearer <token>
- Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
ãªã¯ãšã¹ãããã£:
ããªã¢ã³ããªããžã§ã¯ãã®é
åïŒ1-100é
ç®ïŒãåãªããžã§ã¯ãã«ã¯titleãå¿
èŠã§ãã
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
title | string | â | ååããªã¢ã³ãã¿ã€ãã« |
description | string | â | ããªã¢ã³ãã®èª¬æ |
sku | string | â | åšåº«ç®¡çåäœèå¥å |
imageIds | array of strings | â | ç»åèå¥åã®é å |
price | object | â | äŸ¡æ Œè©³çŽ° |
ã¬ã¹ãã³ã¹ããã£: äœæãããããªã¢ã³ããªããžã§ã¯ãã®é åã
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ããªã¢ã³ããªããžã§ã¯ãã®é
åïŒ1-100é
ç®ïŒãåãªããžã§ã¯ãã«ã¯
titleãå¿ èŠ - ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X POST "{{host}}/product/product-123/variants/bulk" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '[
{
"title": "Small Size",
"sku": "PROD-SM-001",
"price": {
"amount": 19.99,
"currency": "USD"
}
},
{
"title": "Medium Size",
"sku": "PROD-MD-001",
"price": {
"amount": 24.99,
"currency": "USD"
}
}
]'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 201 Created
Content-Type: application/json
[
{
"id": "variant-789",
"productId": "product-123",
"title": "Small Size",
"sku": "PROD-SM-001",
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:30:00.000Z"
},
{
"id": "variant-790",
"productId": "product-123",
"title": "Medium Size",
"sku": "PROD-MD-001",
"createdAt": "2025-01-15T10:30:00.100Z",
"updatedAt": "2025-01-15T10:30:00.100Z"
}
]
22. ååããªã¢ã³ããäžæ¬æŽæ°â
äžåºŠã«åãããŒã¿ã§è€æ°ã®ååããªã¢ã³ããæŽæ°ããŸãïŒãªã¯ãšã¹ãããã1-100ããªã¢ã³ãïŒã
ãªã¯ãšã¹ã:
- Method:
PATCH - Path:
/product/:productId/variants/bulk - Headers:
Content-Type: application/jsonAuthorization: Bearer <token>
- Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
ãªã¯ãšã¹ãããã£:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
ids | array of strings | â | æŽæ°ããããªã¢ã³ãIDã®é åïŒ1-100é ç®ïŒ |
data | object | â | ãã¹ãŠã®ããªã¢ã³ãã«é©çšããæŽæ°ããŒã¿ïŒä»¥äžãåç §ïŒ |
ããŒã¿ãªããžã§ã¯ãïŒãã¹ãŠã®ãã£ãŒã«ãã¯ãªãã·ã§ã³ïŒ:
| Field | Type | å¿ é | 説æ |
|---|---|---|---|
title | string | â | ååããªã¢ã³ãã¿ã€ãã« |
description | string | â | ããªã¢ã³ãã®èª¬æ |
sku | string | â | åšåº«ç®¡çåäœèå¥å |
imageIds | array of strings | â | ç»åèå¥åã®é å |
price | object | â | äŸ¡æ Œè©³çŽ° |
ã¬ã¹ãã³ã¹ããã£: æŽæ°ãããããªã¢ã³ããªããžã§ã¯ãã®é åã
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³:
idsé åïŒ1-100é ç®ïŒãšdataãªããžã§ã¯ããå¿ é - ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X PATCH "{{host}}/product/product-123/variants/bulk" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{
"ids": ["variant-456", "variant-789"],
"data": {
"price": {
"amount": 29.99,
"currency": "USD"
}
}
}'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"id": "variant-456",
"productId": "product-123",
"title": "Large Size",
"price": {
"amount": 29.99,
"currency": "USD"
},
"updatedAt": "2025-01-15T14:22:15.789Z"
},
{
"id": "variant-789",
"productId": "product-123",
"title": "Small Size",
"price": {
"amount": 29.99,
"currency": "USD"
},
"updatedAt": "2025-01-15T14:22:15.789Z"
}
]
ãšã©ãŒã¬ã¹ãã³ã¹:
401 Unauthorized: èªèšŒå€±æ403 Forbidden: é管çè ãŠãŒã¶ãŒãããªã¢ã³ããæŽæ°ããããšãã404 Not Found: 1ã€ä»¥äžã®ååããªã¢ã³ããèŠã€ãããªã500 Internal Server Error: ããŒã¿ããŒã¹æäœå€±æ
23. ååããªã¢ã³ããäžæ¬åé€â
äžåºŠã«è€æ°ã®ååããªã¢ã³ããåé€ããŸãïŒãªã¯ãšã¹ãããã1-100ããªã¢ã³ãïŒã
ãªã¯ãšã¹ã:
- Method:
POST - Path:
/product/:productId/variants/bulk-delete - Headers:
Content-Type: application/jsonAuthorization: Bearer <token>
- Authorization: BearerããŒã¯ã³ãå¿ èŠïŒç®¡çè ïŒ
URLãã©ã¡ãŒã¿:
| Parameter | Type | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪ååID |
ãªã¯ãšã¹ãããã£: åé€ããããªã¢ã³ãIDã®é åïŒ1-100é ç®ïŒã
ã¬ã¹ãã³ã¹ããã£: ã¬ã¹ãã³ã¹ããã£ãªãïŒ204 No ContentïŒ
ããªããŒã·ã§ã³:
- ã¹ããŒãããªããŒã·ã§ã³: ããªã¢ã³ãIDæååã®é åïŒ1-100é ç®ïŒ
- ã«ãŒãããªããŒã¿ãŒ:
- èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠïŒbearerããŒã¯ã³ïŒ
- 管çè ããŒã«ãå¿ èŠ
ãªã¯ãšã¹ãäŸ:
curl -X POST "{{host}}/product/product-123/variants/bulk-delete" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '["variant-456", "variant-789"]'
æåã¬ã¹ãã³ã¹:
HTTP/1.1 204 No Content
ãšã©ãŒã¬ã¹ãã³ã¹:
401 Unauthorized: èªèšŒå€±æ403 Forbidden: é管çè ãŠãŒã¶ãŒãããªã¢ã³ããåé€ããããšãã500 Internal Server Error: ããŒã¿ããŒã¹æäœå€±æ
âïž èšå®ãªãã·ã§ã³â
ãµãŒãã¹èšå®â
interface ProductServiceConfiguration {
authSecrets: {
authEncSecret: string; // JWT encryption secret
authSignSecret: string; // JWT signing secret
};
identity?: {
typeIds?: {
admin: string; // Admin user type identifier
guest: string; // Guest user type identifier
regular: string; // Regular user type identifier
};
};
}
èšå®è©³çްâ
ååãµãŒãã¹èšå®ã¯ãã»ãã¥ãªãã£ãšãŠãŒã¶ãŒã¿ã€ã管çã®ããã®è«çã°ã«ãŒãã«æŽçãããŠããŸãã
ð ã»ãã¥ãªãã£èšå®â
authSecrets - JWTããŒã¯ã³ã»ãã¥ãªãã£ã·ãŒã¯ã¬ãã
- Type:
{ authEncSecret: string; authSignSecret: string } - 説æ: JWTæå·åãšçœ²åçšã®ã·ãŒã¯ã¬ããããŒïŒããŒã¯ã³æ€èšŒã«äœ¿çšïŒ
- å¿ é : ã¯ãïŒæ¬çªç°å¢ã®å ŽåïŒ
- åããããã£:
authEncSecret: JWTãã€ããŒãæå·åçšã®ã·ãŒã¯ã¬ããããŒauthSignSecret: JWTçœ²åæ€èšŒçšã®ã·ãŒã¯ã¬ããããŒ
ð¥ ãŠãŒã¶ãŒã¿ã€ãèšå®â
identity.typeIds - ãŠãŒã¶ãŒã¿ã€ãèå¥åèšå®
- Type:
{ admin?: string; guest?: string; regular?: string } - 説æ: ããŒã«ããŒã¹ã¢ã¯ã»ã¹å¶åŸ¡ã®ããã®ã«ã¹ã¿ã ãŠãŒã¶ãŒã¿ã€ãèå¥å
- ããã©ã«ã:
undefinedïŒããã©ã«ãã¿ã€ãæ€èšŒã䜿çšïŒ - åããããã£:
admin: 管çè ãŠãŒã¶ãŒã¿ã€ãèå¥å- Type:
string - 説æ: 管çè ãŠãŒã¶ãŒçšã®ã«ã¹ã¿ã èå¥å
- ãŠãŒã¹ã±ãŒã¹: 管çæäœã®ããã®ããŒã«ããŒã¹ã¢ã¯ã»ã¹å¶åŸ¡
- äŸ:
"admin","administrator","superuser"
- Type:
guest: ã²ã¹ããŠãŒã¶ãŒã¿ã€ãèå¥å- Type:
string - 説æ: ã²ã¹ããŠãŒã¶ãŒçšã®ã«ã¹ã¿ã èå¥å
- ãŠãŒã¹ã±ãŒã¹: èªèšŒãããŠããªããŸãã¯äžæçãªãŠãŒã¶ãŒåãã®å¶éä»ãã¢ã¯ã»ã¹
- äŸ:
"guest","visitor","anonymous"
- Type:
regular: éåžžãŠãŒã¶ãŒã¿ã€ãèå¥å- Type:
string - 説æ: éåžžãŠãŒã¶ãŒçšã®ã«ã¹ã¿ã èå¥å
- ãŠãŒã¹ã±ãŒã¹: æšæºçãªãŠãŒã¶ãŒã¢ã¯ã»ã¹æš©é
- äŸ:
"user","member","customer"
- Type:
èšå®äŸâ
const productConfig = {
authSecrets: {
authEncSecret: process.env.AUTH_ENC_SECRET || 'your-enc-secret',
authSignSecret: process.env.AUTH_SIGN_SECRET || 'your-sign-secret'
},
identity: {
typeIds: {
admin: '100',
guest: '000',
regular: '001'
}
}
};
ðš ãšã©ãŒãã³ããªã³ã°â
ãã¹ãŠã®ååãµãŒãã¹ãšã©ãŒã¯ãé©åãªHTTPã¹ããŒã¿ã¹ã³ãŒããšå ±ã«JSON圢åŒã§è¿ãããŸãïŒ
äžè¬çãªãšã©ãŒã³ãŒãâ
| Status | Error Message | 説æ |
|---|---|---|
| 400 | Validation Error | ç¡å¹ãªãªã¯ãšã¹ãããã£åœ¢åŒãŸãã¯å¿ é ãã£ãŒã«ãã®æ¬ èœ |
| 400 | Failed to create product | ããŒã¿ããŒã¹æ¿å ¥æäœãæ¿å ¥ãããIDãè¿ããªãã£ã |
| 400 | Failed to update product | æŽæ°æäœãããŒã¿ã倿Žããªãã£ãïŒå€æŽãæ€åºãããªãã£ãïŒ |
| 400 | Failed to create products | ãããäœææäœã倱æãã |
| 400 | Failed to update products | ãããæŽæ°æäœã倱æãã |
| 400 | Failed to delete products | ãããå逿äœã倱æãã |
| 400 | Failed to copy product | ååã³ããŒæäœã倱æãã |
| 400 | Failed to copy products | ãããã³ããŒæäœã倱æãã |
| 401 | token could not be verified | èªèšŒããŒã¯ã³ãæ¬ èœããŠãããç¡å¹ |
| 403 | User is not authorized to access this resource | ãŠãŒã¶ãŒã«å¿ èŠãªæš©éããããŸããïŒç®¡çè ã¢ã¯ã»ã¹ïŒ |
| 404 | Product not found | ãªã¯ãšã¹ããããæäœã«å¯ŸããŠååãååšããŸãã |
| 500 | Failed to create product | äœæäžã®ããŒã¿ããŒã¹æ¥ç¶ã®åé¡ãŸãã¯äºæããªã倱æ |
| 500 | Failed to get product | ååŸäžã®ããŒã¿ããŒã¹æ¥ç¶ã®åé¡ãŸãã¯äºæããªã倱æ |
| 500 | Failed to find products | ãªã¹ãååŸäžã®ããŒã¿ããŒã¹æ¥ç¶ã®åé¡ãç¡å¹ãªãã£ã«ã¿æ§æããŸãã¯äºæããªã倱æ |
| 500 | Failed to update product | æŽæ°äžã®ããŒã¿ããŒã¹æ¥ç¶ã®åé¡ãŸãã¯äºæããªã倱æ |
| 500 | Failed to delete product | åé€äžã®ããŒã¿ããŒã¹æ¥ç¶ã®åé¡ãŸãã¯äºæããªã倱æ |
| 500 | Failed to copy product | ã³ããŒäžã®ããŒã¿ããŒã¹æ¥ç¶ã®åé¡ãŸãã¯äºæããªã倱æ |
ãšã©ãŒã¬ã¹ãã³ã¹åœ¢åŒâ
{
"error": {
"message": "ãšã©ãŒã¡ãã»ãŒãžã®èª¬æ",
"data": ["远å ã®ãšã©ãŒè©³çް"]
}
}
ããªããŒã·ã§ã³ãšã©ãŒã«ã¯è¿œå ã®è©³çްãå«ãŸããŸãïŒ
{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'name'",
"request body must have required property 'description'"
]
}
}
ð é¢é£ããã¥ã¡ã³ãâ
- User Service - ãŠãŒã¶ãŒç®¡çæäœ
- Organization Service - çµç¹ç®¡çæäœ
- Authentication Service - èªèšŒãšèªå¯
- Error Handling - ãšã©ãŒãã¿ãŒã³ã®çè§£
- Schema Component - ããŒã¿ããªããŒã·ã§ã³ã®æŠå¿µ
- Custom Service Tutorial - ç¬èªã®ãµãŒãã¹ãæ§ç¯