ðŠ è£œåãµãŒãã¹
補åãµãŒãã¹ã¯ã補åãšã³ãã£ãã£ãå æ¬çãª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/?authSource=admin', 'dev', 'user', 'password');
// ç»åã¢ããããŒãURLãšã³ããã€ã³ãã§å¿
é :
// GOOGLE_APPLICATION_CREDENTIALS ã GCP ãµãŒãã¹ã¢ã«ãŠã³ã JSON ã«èšå®ãããŠããããšã確èªããŠãã ããã
const fileStorageDriver = createFileStorageDriver('your-gcp-project-id', 'your-bucket-name');
express()
.use(
productService(
{
...(await connectToDatabase('products')),
...(await connectToDatabase('identities')),
...(await connectToDatabase('profiles')), // ããããããŠãŒã¶ãŒã®æ©èœã«å¿
èŠ
...(await connectToDatabase('productVariants')), // 補åããªã¢ã³ãã§ã¯ä»»æ
...(await connectToDatabase('organizations')), // çµç¹å¥è£œåäžèЧã«å¿
èŠ
},
{
authSecrets: {
authEncSecret: 'your-encryption-secret',
authSignSecret: 'your-signing-secret',
},
authMode: 'bearer', // ãŸã㯠'cookie'
identity: {
typeIds: {
admin: '100',
guest: '000',
regular: '001',
},
},
organization: {
roles: {
admin: 'admin',
member: 'member',
owner: 'owner',
},
},
},
{ fileStorageDriver }
)
)
.use(nodeBlocksErrorMiddleware())
.listen(8089, () => console.log('Server running'));
ð ãšã³ããã€ã³ãæŠèŠâ
åå¥è£œåæäœâ
| ã¡ãœãã | ãã¹ | 説æ | èªå¯ |
|---|---|---|---|
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 | æ¢åã®è£œåãã³ã㌠| ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
ãã¡ã€ã«ã¢ããããŒãæäœâ
| ã¡ãœãã | ãã¹ | 説æ | èªå¯ |
|---|---|---|---|
GET | /products/:productId/image-upload-url | 補åç»åã¢ããããŒãçšã®çœ²åä»ãURLãååŸ | ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
POST | /products/:productId/images | 補åç»åãšã³ããªãäœæ | ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
DELETE | /products/:productId/images/:imageId | 補åç»åãåé€ | ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
ããã補åæäœâ
| ã¡ãœãã | ãã¹ | 説æ | èªå¯ |
|---|---|---|---|
POST | /products/batch | è€æ°ã®è£œåãäœæ | ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
PATCH | /products/batch | è€æ°ã®è£œåãæŽæ° | ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
DELETE | /products/batch | è€æ°ã®è£œåãåé€ | ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
POST | /products/batch/copy | è€æ°ã®è£œåãã³ã㌠| ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
補åããªã¢ã³ãæäœâ
| ã¡ãœãã | ãã¹ | 説æ | èªå¯ |
|---|---|---|---|
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 | ããªã¢ã³ããäžæ¬åé€ | ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ |
泚æ: ããªã¢ã³ãã®äžæ¬æäœã¯ãæå³çã«è€æ°åœ¢ã§ã¯ãªã
/product/...ã䜿çšããŸãã
ðïž ãšã³ãã£ãã£ã¹ããŒãâ
補åãšã³ãã£ãã£ã¯ãèªåçæãããããŒã¹ãã£ãŒã«ããšè£œååºæã®ããŒã¿ã§æ§æãããŸãïŒ
{
"name": "string",
"description": "string",
"images": [
{"objectId": "string (uuid)", "type": "string", "id": "string (uuid)"}
],
"createdAt": "string (datetime)",
"id": "string",
"updatedAt": "string (datetime)"
}
ãã£ãŒã«ã詳现â
| ãã£ãŒã«ã | å | èªåçæ | å¿ é | 説æ |
|---|---|---|---|---|
name | string | â | â | 補åå |
description | string | â | â | 補å説æ |
images | array | äžéš | â | 補åç»åã®é å |
images[].objectId | string (uuid) | â | â | ã¹ãã¬ãŒãžå ã®ç»åãã¡ã€ã«èå¥å |
images[].type | string | â | â | ç»åã® MIME ã¿ã€ãïŒäŸïŒimage/pngïŒ |
createdAt | datetime | â | â | äœææ¥æ |
id | string | â | â | äžæèå¥åïŒUUIDïŒ |
updatedAt | datetime | â | â | æçµæŽæ°æ¥æ |
ð æ³šæ: èªåçæãã£ãŒã«ãã¯ãµãŒãã¹åŽã§èšå®ãããäœæ/æŽæ°ãªã¯ãšã¹ãã«å«ããªãã§ãã ãããåç»åã«ã
idãcreatedAtãupdatedAtãèšå®ãããŸããã¬ã¹ãã³ã¹ã§ã¯ç»åã{ type, url }ã«æ£èŠåããobjectIdãšç»åã®ããŒã¹ãã£ãŒã«ãã¯è¿ããŸããããã£ãŒã«ãé åºã¯å®éã® API åºåãšäžèŽããŸãã
ð èªèšŒããããŒâ
ä¿è·ããããšã³ããã€ã³ãã§ã¯ã次ã®ããããŒãå«ããŠãã ããïŒ
Authorization: Bearer <admin_access_token>
x-nb-fingerprint: <device_fingerprint>
â ïž éèŠ: èªå¯æã«ãã£ã³ã¬ãŒããªã³ããæå®ããå ŽåãèªèšŒæžã¿ã®ãã¹ãŠã®ãªã¯ãšã¹ãã§
x-nb-fingerprintããããŒãå¿ é ã§ããæ¬ åŠããŠããå Žå㯠401 Unauthorized ãè¿ããŸãã
ðª Cookie èªèšŒ:
authMode: 'cookie'ã®å Žåãã¢ã¯ã»ã¹ããŒã¯ã³ã¯AuthorizationããããŒã§ã¯ãªãaccessTokenCookie ããèªã¿åãããŸãããã¹ãã¢ããªã±ãŒã·ã§ã³ã§cookie-parserãç»é²ããŠãã ããã
ð§ APIãšã³ããã€ã³ãâ
1. 補åäœæâ
æäŸãããæ å ±ã§æ°ãã補åãäœæããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
POST - ãã¹:
/products - ããããŒ:
Content-Type: application/json,Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
ãªã¯ãšã¹ãããã£:
| ãã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
name | string | â | 補åå |
description | string | â | 補å説æ |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | äžæã®è£œåèå¥å |
name | string | 補åå |
description | string | 補å説æ |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªå匷å¶ïŒnameãdescriptionå¿ é ïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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ã§ç¹å®ã®è£œåãååŸããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
GET - ãã¹:
/products/:productId - èªå¯: äžèŠ
URL ãã©ã¡ãŒã¿:
| ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | äžæã®è£œåèå¥å |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
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. 補åäžèЧâ
ãã£ã«ã¿ãããŒãžã³ã°ãæå®ããŠè£œåã®äžèЧãååŸããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
GET - ãã¹:
/products - èªå¯: äžèŠ
ã¯ãšãªãã©ã¡ãŒã¿:
| ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
name | string | â | 補ååã§ãã£ã«ã¿ |
description | string | â | 補å説æã§ãã£ã«ã¿ |
page | number | â | ããŒãžã³ã°ã®ããŒãžçªå· |
limit | number | â | 1ããŒãžãããã®ä»¶æ° |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
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 ã«ãã補åäžèЧâ
GET /products/organizations/:organizationId ã¯ãçµç¹ã«å±ãã補åãããŒãžããŒã·ã§ã³ä»ãã§è¿ããŸããçµç¹ã¡ã³ããŒä»¥äžã®èªèšŒãå¿
èŠã§ãã
organizationIdãpageïŒ1ïœ1000ïŒãlimitïŒ1ïœ50ïŒã䜿çšã§ããŸããçµç¹ã¡ã³ããŒã管çè
ããŸãã¯ææè
ã§ããããšãæ€èšŒããŸãã
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":[{"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":5,"total":25,"totalPages":5,"hasNext":true,"hasPrev":false}}}
èªèšŒå€±æã¯ 401ãçµç¹ãžã®ã¢ã¯ã»ã¹æš©ããªãå Žå㯠403ãããŒã¿ããŒã¹ãŸãã¯ãã¡ã€ã«ã¹ãã¬ãŒãžã®å€±æã¯ 500 ãè¿ããŸãã
5. 補åã«ããããããããŠãŒã¶ãŒã®äžèЧâ
GET /products/:productId/likers ã¯ã補åã«ããããããããŠãŒã¶ãŒãããŒãžããŒã·ã§ã³ä»ãã§è¿ããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
productIdãpageïŒ1ïœ1000ïŒãlimitïŒ1ïœ50ïŒã䜿çšã§ããŸããã¬ã¹ãã³ã¹ã«ã¯ã¢ãã¿ãŒãããå Žåã眲åä»ã URL ãå«ã avatar ãè¿ããŸãã
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":{"type":"image/jpeg","url":"https://storage.googleapis.com/bucket/abc123..."}}],"metadata":{"pagination":{"page":1,"limit":5,"total":25,"totalPages":5,"hasNext":true,"hasPrev":false}}}
èªèšŒå€±æã¯ 401ãæš©éäžè¶³ã¯ 403ã補åããªãå Žå㯠404ãããŒã¿ããŒã¹ãŸãã¯ãã¡ã€ã«ã¹ãã¬ãŒãžã®å€±æã¯ 500 ãè¿ããŸãã
6. è£œåæŽæ°â
éšåæŽæ°ã§æ¢åã®è£œåãæŽæ°ããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
PATCH - ãã¹:
/products/:productId - ããããŒ:
Content-Type: application/json,Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
URL ãã©ã¡ãŒã¿:
| ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | äžæã®è£œåèå¥å |
ãªã¯ãšã¹ãããã£ïŒå šãã£ãŒã«ãä»»æïŒ:
| ãã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
name | string | â | 補åå |
description | string | â | 補å説æ |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | äžæã®è£œåèå¥å |
name | string | æŽæ°åŸã®è£œåå |
description | string | æŽæ°åŸã®è£œå説æ |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªå匷å¶ïŒéšåæŽæ°ãå šãã£ãŒã«ãä»»æã远å ããããã£äžèš±å¯ïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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. 補ååé€â
ã·ã¹ãã ãã補åãå®å šã«åé€ããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
DELETE - ãã¹:
/products/:productId - ããããŒ:
Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
URL ãã©ã¡ãŒã¿:
| ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | äžæã®è£œåèå¥å |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
| ãªã | - | æåæã¯ã¬ã¹ãã³ã¹ããã£ãªã |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: ãã¹ãã©ã¡ãŒã¿æ€èšŒïŒproductIdå¿ é ïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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ã§äœæããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
POST - ãã¹:
/products/:productId/copy - ããããŒ:
Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
URL ãã©ã¡ãŒã¿:
| ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | ã³ããŒãã補åã®ID |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | ã³ããŒããã補åã®äžæèå¥å |
name | string | 補ååïŒãªãªãžãã«ããã³ããŒïŒ |
description | string | 補å説æïŒãªãªãžãã«ããã³ããŒïŒ |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: ãã¹ãã©ã¡ãŒã¿æ€èšŒïŒproductIdå¿ é ïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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"
}
}
ð ããã補åæäœâ
補åãµãŒãã¹ã¯ãè€æ°ã®è£œåãå¹ççã«ç®¡çããããã®åŒ·åãªãããæäœãæäŸããŸãã
9. è€æ°è£œåäœæâ
åäžã®ãªã¯ãšã¹ãã§è€æ°ã®è£œåãäœæããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
POST - ãã¹:
/products/batch - ããããŒ:
Content-Type: application/json,Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
ãªã¯ãšã¹ãããã£:
åã
ã name ãš description ãå¿
èŠãšãã補åãªããžã§ã¯ãã®é
åã
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | äžæã®è£œåèå¥å |
name | string | 補åå |
description | string | 補å説æ |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªå匷å¶ïŒå¿ é ã®nameããã³descriptionãå«ã補åãªããžã§ã¯ãã®é åïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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. è€æ°è£œåæŽæ°â
åäžã®ãªã¯ãšã¹ãã§è€æ°ã®è£œåãåãããŒã¿ã§æŽæ°ããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
PATCH - ãã¹:
/products/batch - ããããŒ:
Content-Type: application/json,Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
ãªã¯ãšã¹ãããã£:
| ãã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
ids | array of strings | â | æŽæ°ãã補åIDã®é å |
data | object | â | å šè£œåã«é©çšããæŽæ°ããŒã¿ |
data.name | string | â | æ°ãã補åå |
data.description | string | â | æ°ãã補å説æ |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | äžæã®è£œåèå¥å |
name | string | æŽæ°åŸã®è£œåå |
description | string | æŽæ°åŸã®è£œå説æ |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªå匷å¶ïŒidsé åãšdataãªããžã§ã¯ãå¿ é ïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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. è€æ°è£œååé€â
åäžã®ãªã¯ãšã¹ãã§è€æ°ã®è£œåãåé€ããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
DELETE - ãã¹:
/products/batch - ããããŒ:
Content-Type: application/json,Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
ãªã¯ãšã¹ãããã£: åé€ãã補åIDã®é åã
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
| ãªã | - | æåæã¯ã¬ã¹ãã³ã¹ããã£ãªã |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªå匷å¶ïŒæååã®é åïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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. è€æ°è£œåã³ããŒâ
åäžã®ãªã¯ãšã¹ãã§è€æ°ã®è£œåã®ã³ããŒãäœæããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
POST - ãã¹:
/products/batch/copy - ããããŒ:
Content-Type: application/json,Authorization: Bearer <access-token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
ãªã¯ãšã¹ãããã£: ã³ããŒãã補åIDã®é åã
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | ã³ããŒããã補åã®äžæèå¥å |
name | string | 補ååïŒãªãªãžãã«ããã³ããŒïŒ |
description | string | 補å説æïŒãªãªãžãã«ããã³ããŒïŒ |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªå匷å¶ïŒæååã®é åïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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ãè¿ããŸãã
ãªã¯ãšã¹ã:
- ã¡ãœãã:
GET - ãã¹:
/products/:productId/image-upload-url - ããããŒ:
Authorization: Bearer <token> - èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ã®ã¿ïŒ
URL ãã©ã¡ãŒã¿:
| ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 察象補åID |
ã¯ãšãªãã©ã¡ãŒã¿:
| ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
contentType | string | â | ç»åMIMEã¿ã€ãïŒäŸ: image/pngïŒ |
contentLength | number | â | ãã¡ã€ã«ãµã€ãºïŒãã€ãåäœãæå€§10MBïŒ |
ã¬ã¹ãã³ã¹ããã£:
| ãã£ãŒã«ã | å | 説æ |
|---|---|---|
objectId | string | 補åç»åçšã®çæãããã¹ãã¬ãŒãžãªããžã§ã¯ãID |
url | string | ãã¡ã€ã«ãã¢ããããŒãããããã®çœ²åä»ãURL |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: ç»åã¢ããããŒãã¹ããŒãã䜿çšïŒã³ã³ãã³ãã¿ã€ããšãµã€ãºå¶çŽïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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. 補åç»åã®äœæâ
POST /products/:productId/images ã¯ãã¢ããããŒãæžã¿ãªããžã§ã¯ãã® objectId ãš MIME type ããç»åãšã³ããªãäœæããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
| URL ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 察象補å ID |
| ãªã¯ãšã¹ããã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
objectId | string | â | ã¢ããããŒã URL ããååŸããã¹ãã¬ãŒãžãªããžã§ã¯ã ID |
type | string | â | ç»åã®ã¿ã€ããŸãã¯ã«ããŽãª |
| ã¬ã¹ãã³ã¹ãã£ãŒã«ã | å | 説æ |
|---|---|---|
type | string | ç»åã® MIME ã¿ã€ã |
url | string | ã¢ããããŒãç»åã®çœ²åä»ã URL |
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"}'
HTTP/1.1 201 Created
Content-Type: application/json
{"type":"image/webp","url":"https://storage.googleapis.com/bucket/products/...&X-Goog-Expires=900&X-Goog-Signature=..."}
15. 補åç»åã®åé€â
DELETE /products/:productId/images/:imageId ã¯ç»åãšã³ããªãåé€ããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
| URL ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
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. 補åããªã¢ã³ãã®äœæâ
POST /products/:productId/variants ã¯è£œåããªã¢ã³ããäœæããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
| ãªã¯ãšã¹ããã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
title | string | â | ããªã¢ã³ãã®ã¿ã€ãã« |
description | string | â | ããªã¢ã³ãã®èª¬æ |
sku | string | â | åšåº«ç®¡çåäœã®èå¥å |
imageIds | string é å | â | ããªã¢ã³ãã«é¢é£ä»ããç»å ID |
price | object | â | äŸ¡æ Œæ å ± |
price ã«ã¯ amountãcurrencyãtaxIncludedãtaxable ãæå®ã§ããŸãããªã¯ãšã¹ãããã£ã§ã¯ title ãå¿
é ã§ãã
| äŸ¡æ Œãã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
amount | number | â | äŸ¡æ Œ |
currency | string | â | ISO é貚ã³ãŒã |
taxIncluded | boolean | â | äŸ¡æ Œã«çšãå«ãŸããã |
taxable | boolean | â | ããªã¢ã³ãã課çšå¯Ÿè±¡ã |
| ã¬ã¹ãã³ã¹ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | äžæã®ããªã¢ã³ãèå¥å |
productId | string | 芪補å ID |
title | string | ããªã¢ã³ãã®ã¿ã€ãã« |
description | string | ããªã¢ã³ãã®èª¬æ |
sku | string | åšåº«ç®¡çåäœ |
imageIds | array | ç»å ID ã®é å |
price | object | äŸ¡æ Œæ å ± |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
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. 補åããªã¢ã³ãã®äžèЧâ
GET /products/:productId/variants ã¯è£œåã®ããªã¢ã³ããäžèЧã§è¿ããŸããèªèšŒã¯äžèŠã§ãã
pageïŒ1ïœ1000ïŒãš limitïŒ1ïœ50ïŒã§ããŒãžããŒã·ã§ã³ãæå®ã§ããŸããã¬ã¹ãã³ã¹ã¯ããªã¢ã³ãé
å data ãšããŒãžããŒã·ã§ã³æ
å ± metadata ãè¿ããŸãã
{"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. 補åããªã¢ã³ãã®ååŸâ
GET /products/:productId/variants/:productVariantId ã¯æå®ãããããªã¢ã³ããè¿ããŸããèªèšŒãå¿
èŠã§ãã
productId ãš productVariantId ã®äž¡æ¹ã URL ãã©ã¡ãŒã¿ã«æå®ããŸãããªã¯ãšã¹ãã«ã¯èªèšŒæžã¿ã® bearer ããŒã¯ã³ãå¿
èŠã§ãã
| URL ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
|---|---|---|---|
productId | string | â | 芪補å ID |
productVariantId | string | â | ããªã¢ã³ã ID |
| ã¬ã¹ãã³ã¹ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | äžæã®ããªã¢ã³ãèå¥å |
productId | string | 芪補å ID |
title | string | ããªã¢ã³ãã®ã¿ã€ãã« |
description | string | ããªã¢ã³ãã®èª¬æ |
sku | string | åšåº«ç®¡çåäœ |
imageIds | array | ç»å ID ã®é å |
price | object | äŸ¡æ Œæ å ± |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
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ãããªã¢ã³ãããªãå Žå㯠404ãããŒã¿ããŒã¹æäœã«å€±æããå Žå㯠500 ãè¿ããŸãã
19. 補åããªã¢ã³ãã®æŽæ°â
PATCH /products/:productId/variants/:productVariantId ã¯ããªã¢ã³ããæŽæ°ããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
titleãdescriptionãskuãimageIdsãprice ã¯ãã¹ãŠä»»æã§ããprice ã® amountãcurrencyãtaxIncludedãtaxable ãä»»æã§ãã远å ããããã£ã¯äœ¿çšã§ããŸããã
| æŽæ°ãã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
title | string | â | ããªã¢ã³ãã®ã¿ã€ãã« |
description | string | â | ããªã¢ã³ãã®èª¬æ |
sku | string | â | åšåº«ç®¡çåäœã®èå¥å |
imageIds | string é å | â | é¢é£ä»ããç»å ID |
price | object | â | äŸ¡æ Œæ å ± |
| äŸ¡æ Œãã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
amount | number | â | äŸ¡æ Œ |
currency | string | â | ISO é貚ã³ãŒã |
taxIncluded | boolean | â | äŸ¡æ Œã«çšãå«ãŸããã |
taxable | boolean | â | ããªã¢ã³ãã課çšå¯Ÿè±¡ã |
| æŽæ°ã¬ã¹ãã³ã¹ãã£ãŒã«ã | å | 説æ |
|---|---|---|
id | string | äžæã®ããªã¢ã³ãèå¥å |
productId | string | 芪補å ID |
title | string | æŽæ°åŸã®ããªã¢ã³ãã¿ã€ãã« |
description | string | æŽæ°åŸã®ããªã¢ã³ã説æ |
sku | string | æŽæ°åŸã®åšåº«ç®¡çåäœ |
imageIds | array | æŽæ°åŸã®ç»å ID é å |
price | object | æŽæ°åŸã®äŸ¡æ Œæ å ± |
createdAt | string | äœææ¥æ |
updatedAt | string | æçµæŽæ°æ¥æ |
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ãæš©éäžè¶³ã¯ 403ãããªã¢ã³ãããªãå Žå㯠404ãããŒã¿ããŒã¹æäœã®å€±æã¯ 500 ãè¿ããŸãã
20. 補åããªã¢ã³ãã®åé€â
DELETE /products/:productId/variants/:productVariantId ã¯ããªã¢ã³ããåé€ããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
curl -X DELETE "{{host}}/products/product-123/variants/variant-456" \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 204 No Content
èªèšŒå€±æã¯ 401ãæš©éäžè¶³ã¯ 403ãããŒã¿ããŒã¹æäœã®å€±æã¯ 500 ãè¿ããŸãã
21. 補åããªã¢ã³ãã®äžæ¬äœæâ
POST /product/:productId/variants/bulk ã¯è€æ°ã®ããªã¢ã³ããäœæããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
1 åã®ãªã¯ãšã¹ãã§ 1ïœ100 ä»¶ã®ããªã¢ã³ããäœæã§ããŸããåããªã¢ã³ãã«ã¯ title ãå¿
èŠã§ãã
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"},{"title":"Large Size","sku":"PROD-LG-001"}]'
HTTP/1.1 201 Created
Content-Type: application/json
[{"id":"variant-1","productId":"product-123","title":"Small Size","sku":"PROD-SM-001"},{"id":"variant-2","productId":"product-123","title":"Large Size","sku":"PROD-LG-001"}]
22. 補åããªã¢ã³ãã®äžæ¬æŽæ°â
PATCH /product/:productId/variants/bulk ã¯è€æ°ã®ããªã¢ã³ããæŽæ°ããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
ids ã«æŽæ°å¯Ÿè±¡ã®ããªã¢ã³ã ID é
åããdata ã«å
±éã®æŽæ°å
容ãæå®ããŸãã
| ãªã¯ãšã¹ããã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
ids | string é å | â | æŽæ°ããããªã¢ã³ã ID ã®é å |
data | object | â | ãã¹ãŠã®å¯Ÿè±¡ã«é©çšããæŽæ°ããŒã¿ |
curl -X PATCH "{{host}}/product/product-123/variants/bulk" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{"ids":["variant-1","variant-2"],"data":{"price":{"amount":34.99,"currency":"USD"}}}'
HTTP/1.1 200 OK
Content-Type: application/json
[{"id":"variant-1","productId":"product-123"},{"id":"variant-2","productId":"product-123"}]
23. 補åããªã¢ã³ãã®äžæ¬åé€â
POST /product/:productId/variants/bulk-delete ã¯è€æ°ã®ããªã¢ã³ããåé€ããŸãã管çè
ã®èªèšŒãå¿
èŠã§ãã
| ãªã¯ãšã¹ããã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
ids | string é å | â | åé€ããããªã¢ã³ã ID ã®é å |
curl -X POST "{{host}}/product/product-123/variants/bulk-delete" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{"ids":["variant-1","variant-2"]}'
HTTP/1.1 204 No Content
補å API ãã£ãŒã«ããªãã¡ã¬ã³ã¹:
| åºå | ãã£ãŒã«ããŸãã¯æäœ | 説æ |
|---|---|
| 補å | id | äžæã®è£œåèå¥å |
| 補å | name | 補åå |
| 補å | description | 補å説æ |
| 補å | images | 補åç»åã®é
å |
| 補å | images[].objectId | ã¹ãã¬ãŒãžå
ã®ç»åãªããžã§ã¯ã ID |
| 補å | images[].type | ç»åã® MIME ã¿ã€ã |
| 補å | images[].createdAt | ç»åã®äœææ¥æ |
| 補å | images[].updatedAt | ç»åã®æçµæŽæ°æ¥æ |
| 補å | createdAt | 補åã®äœææ¥æ |
| 補å | updatedAt | 補åã®æçµæŽæ°æ¥æ |
| ç»å | objectId | ã¢ããããŒãæžã¿ãã¡ã€ã«ã®ã¹ãã¬ãŒãž ID |
| ç»å | type | äœæããç»åã®ã«ããŽãª |
| ç»å | url | ãã¡ã€ã«ã¢ã¯ã»ã¹çšã®çœ²åä»ã URL |
| ç»å | contentType | ã¢ããããŒã URL çšã®ç»å MIME ã¿ã€ã |
| ç»å | contentLength | ã¢ããããŒããããã¡ã€ã«ãµã€ãº |
| çµç¹äžèЧ | organizationId | çµç¹ã¹ã³ãŒãã®è£œåååŸã«äœ¿ã ID |
| çµç¹äžèЧ | page | ããŒãžçªå·ïŒ1ïœ1000ïŒ |
| çµç¹äžèЧ | limit | 1ããŒãžãããã®ä»¶æ°ïŒ1ïœ50ïŒ |
| çµç¹äžèЧ | data | 補åãªããžã§ã¯ãã®é
å |
| çµç¹äžèЧ | metadata.pagination.page | çŸåšã®ããŒãžçªå· |
| çµç¹äžèЧ | metadata.pagination.limit | ããŒãžãµã€ãº |
| çµç¹äžèЧ | metadata.pagination.total | 補åã®ç·æ° |
| çµç¹äžèЧ | metadata.pagination.totalPages | ç·ããŒãžæ° |
| çµç¹äžèЧ | metadata.pagination.hasNext | 次ã®ããŒãžãããã |
| çµç¹äžèЧ | metadata.pagination.hasPrev | åã®ããŒãžãããã |
| ãããäžèЧ | productId | ããããååŸãã補å ID |
| ãããäžèЧ | data[].id | ããããããŠãŒã¶ãŒã® ID |
| ãããäžèЧ | data[].name | ããããããŠãŒã¶ãŒã®è¡šç€ºå |
| ãããäžèЧ | data[].avatar | 眲åä»ã URL ãå«ãã¢ãã¿ãŒ |
| ãããäžèЧ | data[].avatar.type | ã¢ãã¿ãŒç»åã® MIME ã¿ã€ã |
| ãããäžèЧ | data[].avatar.url | ã¢ãã¿ãŒååŸçšã®çœ²åä»ã URL |
| ããªã¢ã³ã | productId | 芪補å ID |
| ããªã¢ã³ã | id | äžæã®ããªã¢ã³ãèå¥å |
| ããªã¢ã³ã | title | ããªã¢ã³ãã®ã¿ã€ãã« |
| ããªã¢ã³ã | description | ããªã¢ã³ãã®èª¬æ |
| ããªã¢ã³ã | sku | åšåº«ç®¡çåäœã®èå¥å |
| ããªã¢ã³ã | imageIds | é¢é£ä»ããç»å ID ã®é
å |
| ããªã¢ã³ã | price | ããªã¢ã³ãã®äŸ¡æ Œæ
å ± |
| ããªã¢ã³ã | price.amount | äŸ¡æ Œ |
| ããªã¢ã³ã | price.currency | ISO é貚ã³ãŒã |
| ããªã¢ã³ã | price.taxIncluded | äŸ¡æ Œã«çšãå«ãŸããã |
| ããªã¢ã³ã | price.taxable | 課çšå¯Ÿè±¡ã |
| ããªã¢ã³ã | createdAt | ããªã¢ã³ãã®äœææ¥æ |
| ããªã¢ã³ã | updatedAt | ããªã¢ã³ãã®æçµæŽæ°æ¥æ |
| äžæ¬äœæ | POST /products/batch | è€æ°ã®è£œåãäœæ |
| äžæ¬æŽæ° | PATCH /products/batch | è€æ°ã®è£œåãæŽæ° |
| äžæ¬åé€ | DELETE /products/batch | è€æ°ã®è£œåãåé€ |
| äžæ¬ã³ã㌠| POST /products/batch/copy | è€æ°ã®è£œåãã³ã㌠|
| äžæ¬ããªã¢ã³ãäœæ | POST /product/:productId/variants/bulk | 1ïœ100 ä»¶ã®ããªã¢ã³ããäœæ |
| äžæ¬ããªã¢ã³ãæŽæ° | PATCH /product/:productId/variants/bulk | æå®ããããªã¢ã³ãçŸ€ãæŽæ° |
| äžæ¬ããªã¢ã³ãåé€ | POST /product/:productId/variants/bulk-delete | æå®ããããªã¢ã³ã矀ãåé€ |
| äžæ¬ããªã¢ã³ã | ids | æäœå¯Ÿè±¡ã®ããªã¢ã³ã ID é
å |
| äžæ¬ããªã¢ã³ã | data | äžæ¬æŽæ°ã§é©çšããå
±éã®æŽæ°ããŒã¿ |
| äœæ | POST /products | æ°ãã補åãäœæ |
| ååŸ | GET /products/:productId | ID æå®ã§è£œåãååŸ |
| äžèЧ | GET /products | 補åãäžèЧãŸãã¯ãã£ã«ã¿ååŸ |
| æŽæ° | PATCH /products/:productId | 補åãéšåæŽæ° |
| åé€ | DELETE /products/:productId | 補åãåé€ |
| ã³ã㌠| POST /products/:productId/copy | 補åã®ã³ããŒãäœæ |
| ç»å URL | GET /products/:productId/image-upload-url | ç»åã¢ããããŒãçšã®çœ²åä»ã URL ãååŸ |
| ç»åäœæ | POST /products/:productId/images | 補åç»åãšã³ããªãäœæ |
| ç»ååé€ | DELETE /products/:productId/images/:imageId | 補åç»åãåé€ |
| ããªã¢ã³ãäœæ | POST /products/:productId/variants | 補åããªã¢ã³ããäœæ |
| ããªã¢ã³ãäžèЧ | GET /products/:productId/variants | 補åã®ããªã¢ã³ããäžèЧååŸ |
| ããªã¢ã³ãååŸ | GET /products/:productId/variants/:productVariantId | æå®ããªã¢ã³ããååŸ |
| ããªã¢ã³ãæŽæ° | PATCH /products/:productId/variants/:productVariantId | æå®ããªã¢ã³ããæŽæ° |
| ããªã¢ã³ãåé€ | DELETE /products/:productId/variants/:productVariantId | æå®ããªã¢ã³ããåé€ |
| èªå¯ | 補åäœæ | 管çè
ã® bearer èªèšŒãå¿
èŠ |
| èªå¯ | è£œåæŽæ° | 管çè
ã® bearer èªèšŒãå¿
èŠ |
| èªå¯ | 補ååé€ | 管çè
ã® bearer èªèšŒãå¿
èŠ |
| èªå¯ | 補åã³ã㌠| 管çè
ã® bearer èªèšŒãå¿
èŠ |
| èªå¯ | çµç¹å¥äžèЧ | çµç¹ã¡ã³ããŒã管çè
ããŸãã¯ææè
ãå¿
èŠ |
| èªå¯ | ãããäžèЧ | 管çè
ã® bearer èªèšŒãå¿
èŠ |
| èªå¯ | ããªã¢ã³ãäœæ | 管çè
ã® bearer èªèšŒãå¿
èŠ |
| èªå¯ | ããªã¢ã³ãäžèЧ | èªèšŒã¯äžèŠ |
| èªå¯ | ããªã¢ã³ãååŸ | bearer èªèšŒãå¿
èŠ |
| èªå¯ | ããªã¢ã³ãæŽæ° | 管çè
ã® bearer èªèšŒãå¿
èŠ |
| èªå¯ | ããªã¢ã³ãåé€ | 管çè
ã® bearer èªèšŒãå¿
èŠ |
| æ€èšŒ | name | 補åäœææã«å¿
é |
| æ€èšŒ | description | 補åäœææã«å¿
é |
| æ€èšŒ | title | ããªã¢ã³ãäœææã«å¿
é |
| æ€èšŒ | productId | 補åããã³ããªã¢ã³ãæäœã®ãã¹ã§å¿
é |
| æ€èšŒ | productVariantId | åå¥ããªã¢ã³ãæäœã®ãã¹ã§å¿
é |
| æ€èšŒ | imageId | 補åç»ååé€ã®ãã¹ã§å¿
é |
| ãšã©ãŒ | 401 Unauthorized | èªèšŒããŒã¯ã³ããªãããŸãã¯ç¡å¹ |
| ãšã©ãŒ | 403 Forbidden | å¿
èŠãªç®¡çè
ãŸãã¯çµç¹æš©éããªã |
| ãšã©ãŒ | 404 Not Found | 補åãŸãã¯ããªã¢ã³ããååšããªã |
| ãšã©ãŒ | 500 Internal Server Error | ããŒã¿ããŒã¹ãŸãã¯ãã¡ã€ã«ã¹ãã¬ãŒãžæäœã«å€±æ |
æäœäžã®æ³šæ:
- ç»åã®ã¹ãã¬ãŒãžåç §ã¯ API ã¬ã¹ãã³ã¹ã§ã¢ã¯ã»ã¹å¯èœãª URL ã«æ£èŠåãããŸãã
- ç»åã¢ããããŒã URL ãååŸããåŸã§ãè¿ããã URL ãžãã¡ã€ã«ãã¢ããããŒãããŠãã ããã
- ç»åãšã³ããªã®äœæã§ã¯ãã¢ããããŒãæžã¿ã®
objectIdã䜿çšããŸãã - 補åç»åãåé€ãããšãé¢é£ããã¯ã©ãŠãã¹ãã¬ãŒãžãã¡ã€ã«ãåé€ãããŸãã
- 補åäœæã§ã¯
nameãšdescriptionã®äž¡æ¹ãå¿ èŠã§ãã - è£œåæŽæ°ã§ã¯æå®ãããã£ãŒã«ãã ãã倿ŽãããŸãã
- 補åã®èªåçæãã£ãŒã«ãã¯äœæãŸãã¯æŽæ°ãªã¯ãšã¹ãã«æå®ããŸããã
- 補åã³ããŒã§ã¯å ã®è£œåãšã¯ç°ãªãæ°ãã ID ãçæãããŸãã
- ãããäœæã§ã¯å補åãåå¥ã«æ€èšŒãããŸãã
- ãããæŽæ°ã§ã¯
idsã®ãã¹ãŠã®è£œåã«åãdataãé©çšããŸãã - ãããåé€ã§ã¯åé€å¯Ÿè±¡ã®è£œå ID é åããªã¯ãšã¹ãããã£ã«æž¡ããŸãã
- ãããã³ããŒã§ã¯åã³ããŒã«æ°ãã補å ID ãçæãããŸãã
- çµç¹å¥äžèЧã¯ãã«ãããã³ãã®è£œåã«ã¿ãã°ã«é©ããŠããŸãã
- çµç¹å¥äžèЧã§ã¯çµç¹ããŒã«ã®èšå®ãå¿ èŠã§ãã
- çµç¹ã¡ã³ããŒã§ãªããŠãŒã¶ãŒã¯çµç¹å¥è£œåãååŸã§ããŸããã
- 補åã«ããããããããŠãŒã¶ãŒã®äžèЧã¯ç®¡çè åãã®åæã«å©çšã§ããŸãã
- ãããäžèЧã®ã¢ãã¿ãŒ URL ã¯ã¹ãã¬ãŒãžåç §ããæ£èŠåãããŸãã
- ããªã¢ã³ãã䜿çšããå Žåã¯
productVariantsããŒã¿ã¹ãã¢ãæäŸããŠãã ããã - ããªã¢ã³ãã®ã¿ã€ãã«ã¯äœææã«å¿ é ã§ãã
- ããªã¢ã³ãã®èª¬æã¯ä»»æã§ãã
- ããªã¢ã³ãã® SKU ã¯ä»»æã§ãã
- ããªã¢ã³ãã«ã¯è€æ°ã®è£œåç»åãé¢é£ä»ããããŸãã
- ããªã¢ã³ãäŸ¡æ Œã«ã¯é貚ãæå®ã§ããŸãã
taxIncludedã¯äŸ¡æ Œã«çšãå«ãããã衚ããŸããtaxableã¯ããªã¢ã³ãã課çšå¯Ÿè±¡ãã衚ããŸãã- ããªã¢ã³ãäžèЧã¯å ¬éã®èªã¿åãæäœã§ãã
- åå¥ããªã¢ã³ãã®ååŸã«ã¯èªèšŒãå¿ èŠã§ãã
- ããªã¢ã³ãã®å€æŽãšåé€ã¯ç®¡çè ã«éå®ãããŸãã
- äžæ¬ããªã¢ã³ãäœæã¯ 1 åã«ã€ã 1ïœ100 ä»¶ãåãä»ããŸãã
- äžæ¬ããªã¢ã³ãæŽæ°ã¯è€æ° ID ãšå ±éããŒã¿ãåãåããŸãã
- äžæ¬ããªã¢ã³ãåé€ã¯ ID é åãåãåããŸãã
- äžæ¬ããªã¢ã³ãã«ãŒãã¯æå³çã«åæ°åœ¢ã®
/productã䜿çšããŸãã - éåžžã®è£œåã«ãŒãã¯è€æ°åœ¢ã®
/productsã䜿çšããŸãã - ããŒãžçªå·ã¯ 1 ããå§ãŸããŸãã
limit㯠1 ããŒãžã«è¿ãæå€§ä»¶æ°ãæå®ããŸããtotalã¯ãã£ã«ã¿ãŒçµæå šäœã®ä»¶æ°ã衚ããŸããtotalPagesã¯çµæå šäœã®ããŒãžæ°ã衚ããŸããhasNextã¯æ¬¡ããŒãžã®æç¡ã衚ããŸããhasPrevã¯åããŒãžã®æç¡ã衚ããŸãã- 補åãèŠã€ãããªãå Žåã¯
404ãè¿ããŸãã - ããªã¢ã³ããèŠã€ãããªãå Žåã¯
404ãè¿ããŸãã - èªèšŒæ
å ±ããªãå Žåã¯
401ãè¿ããŸãã - 管çè
æš©éããªãå Žåã¯
403ãè¿ããŸãã - ç¡å¹ãªãªã¯ãšã¹ãããã£ã¯
400ãè¿ããŸãã - ããŒã¿ã¹ãã¢åŠçã®å€±æã¯
500ãè¿ããŸãã - ãã¡ã€ã«ã¹ãã¬ãŒãžåŠçã®å€±æã¯
500ãè¿ããŸãã - 眲åä»ã URL ã«ã¯æå¹æéããããããããã«äœ¿çšããŠãã ããã
- ç»å MIME ã¿ã€ããšãã¡ã€ã«ãµã€ãºã¯ã¢ããããŒãã¹ããŒãã§æ€èšŒãããŸãã
- ç»åãå«ã補åã®ã¬ã¹ãã³ã¹ã§ã¯ç»åããšã«
typeãšurlãè¿ããŸãã - 補åããŒã¿ã®ãã£ãŒã«ãé åºã¯å®éã® API åºåã«åŸããŸãã
- 管ççšã¯ã©ã€ã¢ã³ãã§ã¯ã倱æãããããæäœã®ãšã©ãŒã衚瀺ããŠãã ããã
- å ¬éã¯ã©ã€ã¢ã³ãã§ã¯ãããªã¢ã³ãäžèЧã®ããŒãžããŒã·ã§ã³ãåŠçããŠãã ããã
- 補åã«ã¿ãã°ã§ã¯ãçµç¹ã¹ã³ãŒããšå ¬éã¹ã³ãŒããåºå¥ããŠãã ããã
- ç»åãåç §ããåã«ã眲åä»ã URL ã®æå¹æéãèæ ®ããŠãã ããã
- 管çè æäœã«ã¯å®å šãª bearer ããŒã¯ã³ãŸã㯠cookie èªèšŒã䜿çšããŠãã ããã
authMode: 'cookie'ã䜿ãå Žåãã¢ã¯ã»ã¹ããŒã¯ã³ã¯ Cookie ããèªã¿åãããŸãã- bearer ã¢ãŒãã§ã¯
AuthorizationããããŒã«ã¢ã¯ã»ã¹ããŒã¯ã³ãæå®ããŸãã - ãã£ã³ã¬ãŒããªã³ããèªå¯æã«æå®ãããŠããå Žåã¯
x-nb-fingerprintãéä¿¡ããŸãã - 補åãšããªã¢ã³ãã® ID 㯠API ãè¿ããå€ã䜿çšããŠãã ããã
- SKU ã¯åšåº«ã·ã¹ãã ãšçµ±åããå Žåã®ã¢ããªã±ãŒã·ã§ã³åŽèå¥åãšããŠäœ¿çšã§ããŸãã
- 補åäœæã®æåã¬ã¹ãã³ã¹ã«ã¯äœææ¥æãšæŽæ°æ¥æãå«ãŸããŸãã
- è£œåæŽæ°ã®æåã¬ã¹ãã³ã¹ã«ã¯æŽæ°åŸã®å€ãå«ãŸããŸãã
- 補ååé€ãæåããå Žåã®ã¹ããŒã¿ã¹ã¯
204 No Contentã§ãã - 補åç»åã®äœæãæåããå Žåã®ã¹ããŒã¿ã¹ã¯
201 Createdã§ãã - ããªã¢ã³ãäœæãæåããå Žåã®ã¹ããŒã¿ã¹ã¯
201 Createdã§ãã - ããªã¢ã³ãæŽæ°ãæåããå Žåã®ã¹ããŒã¿ã¹ã¯
200 OKã§ãã - ããªã¢ã³ãåé€ãæåããå Žåã®ã¹ããŒã¿ã¹ã¯
204 No Contentã§ãã - äžæ¬ããªã¢ã³ãåé€ãæåããå Žåã®ã¹ããŒã¿ã¹ã¯
204 No Contentã§ãã - ã¢ããããŒã URL ã®ååŸã«ã¯å¯Ÿè±¡è£œåã® ID ãå¿ èŠã§ãã
- ç»åãšã³ããªã®äœæã«ã¯å¯Ÿè±¡è£œåã® ID ãå¿ èŠã§ãã
- ç»åãšã³ããªã®åé€ã«ã¯å¯Ÿè±¡è£œå ID ãšç»å ID ãå¿ èŠã§ãã
- ããªã¢ã³ãäœæã«ã¯èŠªè£œåã® ID ãå¿ èŠã§ãã
- ããªã¢ã³ãååŸã«ã¯èŠªè£œå ID ãšããªã¢ã³ã ID ãå¿ èŠã§ãã
- ããªã¢ã³ãæŽæ°ã«ã¯èŠªè£œå ID ãšããªã¢ã³ã ID ãå¿ èŠã§ãã
- ããªã¢ã³ãåé€ã«ã¯èŠªè£œå ID ãšããªã¢ã³ã ID ãå¿ èŠã§ãã
- ããã補åæäœã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- åå¥è£œåã®äœæã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- åå¥è£œåã®æŽæ°ã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- åå¥è£œåã®åé€ã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- åå¥è£œåã®ã³ããŒã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- ç»åã¢ããããŒã URL ã®ååŸã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- 補åç»åã®äœæã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- 補åç»åã®åé€ã«ã¯ç®¡çè èªå¯ãå¿ èŠã§ãã
- API ã¬ã¹ãã³ã¹ã® URL ã¯çŽæ¥ã¹ãã¬ãŒãžãªããžã§ã¯ã ID ãå ¬éããŸããã
- ç»å URL ãã¯ã©ã€ã¢ã³ãã«ä¿åããå Žåã¯æå¹æéåããåŠçããŠãã ããã
- çµç¹å¥è£œåäžèЧã¯ç»å URL ã®æ£èŠåãè¡ããŸãã
- ãããäžèЧã¯ã¢ãã¿ãŒ URL ã®æ£èŠåãè¡ããŸãã
- ããªã¢ã³ãäžèЧã®åèŠçŽ ã«ã¯èŠªè£œå ID ãå«ãŸããŸãã
- ããªã¢ã³ãäžèЧã®åèŠçŽ ã«ã¯äŸ¡æ Œæ å ±ãå«ããããŸãã
- äžæ¬äœæã®ããªã¢ã³ãã¯åã芪補åã«é¢é£ä»ããããŸãã
- äžæ¬æŽæ°ã®ããªã¢ã³ãã¯åã芪補åã«å±ããŠããå¿ èŠããããŸãã
- äžæ¬åé€ã®ããªã¢ã³ãã¯åã芪補åã«å±ããŠããå¿ èŠããããŸãã
- é貚ã³ãŒãã¯äŸ¡æ Œãæ±ãã¯ã©ã€ã¢ã³ãã§é©åã«è¡šç€ºããŠãã ããã
- çšã®æ±ãã¯
taxIncludedãštaxableã®çµã¿åããã«åŸããŸãã - 管çããã·ã¥ããŒãã§ã¯ã補åãšããªã¢ã³ãã®æŽæ°æ¥æã衚瀺ã§ããŸãã
- 補åã³ããŒåŸã¯ãå¿ èŠã«å¿ããŠååã説æãæŽæ°ããŠãã ããã
- ç»åã远å ããåã«ã察象補åãååšããããšã確èªããŠãã ããã
- ããªã¢ã³ããäœæããåã«ã察象補åãååšããããšã確èªããŠãã ããã
- API ãšã©ãŒã®ãµãŒããŒè¿åŽã¡ãã»ãŒãžã¯æè¡ãªãã©ã«ãšããŠæ±ã£ãŠãã ããã
- ãã¹ãŠã®ããŒãžããŒã·ã§ã³ã¬ã¹ãã³ã¹ã§ã¯
dataãšmetadataã確èªããŠãã ããã - ããŒãžãµã€ãºã¯ã¯ã©ã€ã¢ã³ãã®è¡šç€ºèŠä»¶ã«åãããŠéžæããŠãã ããã
- 倧ããªè£œåã«ã¿ãã°ã§ã¯æ¬¡ããŒãžã®æç¡ã䜿çšããŠè¿œå èªã¿èŸŒã¿ãå®è£ ã§ããŸãã
- äŸ¡æ ŒãæŽæ°ããå Žåã¯é貚ã³ãŒãã確èªããŠãã ããã
- ç»åãæŽæ°ããå Žåã¯æ°ããã¢ããããŒã URL ãååŸããŠãã ããã
- å逿žã¿ã®ç»å ID ãåå©çšããªãã§ãã ããã
- 補åã®å ¬é衚瀺ã§ã¯æ£èŠåæžã¿ã®ç»å URL ã䜿çšããŠãã ããã
- ããªã¢ã³ãã®å ¬é衚瀺ã§ã¯ã¿ã€ãã«ãšäŸ¡æ Œãäžè²«ããŠè¡šç€ºããŠãã ããã
ããªã¢ã³ãæ©èœã§ã¯ productVariants ããŒã¿ã¹ãã¢ãå¿
èŠã§ããäžæ¬ããªã¢ã³ãã«ãŒãã¯ãæå³çã«è€æ°åœ¢ã§ã¯ãªã /product/:productId/variants/bulk ããã³ /bulk-delete ã䜿çšããŸããã€ãŸãããããã®ã«ãŒãã§ã¯ /products/... ãã¬ãã£ãã¯ã¹ã䜿çšããŸããã
âïž èšå®ãªãã·ã§ã³â
ããŒã¿ã¹ãã¢â
| ã³ã¬ã¯ã·ã§ã³ | å¿ é | 説æ |
|---|---|---|
products | â | 補åããã¥ã¡ã³ã |
identities | â | ã¢ã€ãã³ãã£ãã£ã®æ€çŽ¢ããã³èªèšŒã³ã³ããã¹ã |
profiles | â | 補åã«ããããããããŠãŒã¶ãŒã®ãããã£ãŒã« |
productVariants | â | 補åããªã¢ã³ãã®ãšã³ããã€ã³ãã§ã®ã¿å¿ èŠ |
organizations | â | /products/organizations/:organizationId ã§å¿
èŠ |
çµç¹ã¹ã³ãŒãã®ãšã³ããã€ã³ãã«ã¯ configuration.organization.roles ãå¿
èŠã§ãããã®ããŒã«ã¯ ownerãadminãmember ãå«ããŠãã ããã
ãµãŒãã¹èšå®â
interface ProductServiceConfiguration {
authSecrets: {
authEncSecret: string; // JWT æå·åã·ãŒã¯ã¬ãã
authSignSecret: string; // JWT 眲åã·ãŒã¯ã¬ãã
};
authMode?: 'bearer' | 'cookie'; // æªæå®æã¯ bearer
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 productConfig = {
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圢åŒã§è¿ãããŸãïŒ
代衚çãªãšã©ãŒã³ãŒãâ
| ã¹ããŒã¿ã¹ | ãšã©ãŒã¡ãã»ãŒãž | 説æ |
|---|---|---|
| 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 | äœæäžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
| 500 | Failed to get product | ååŸäžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
| 500 | Failed to find products | äžèЧååŸäžã®DBæ¥ç¶åé¡/ãã£ã«ã¿æ§æäžæ£/äºæãã¬å€±æ |
| 500 | Failed to update product | æŽæ°äžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
| 500 | Failed to delete product | åé€äžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
| 500 | Failed to copy product | ã³ããŒäžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
ãšã©ãŒã¬ã¹ãã³ã¹åœ¢åŒâ
{
"error": {
"message": "Error message description",
"data": ["Additional error details"]
}
}
æ€èšŒãšã©ãŒã«ã¯è¿œå ã®è©³çްãå«ãŸããŸãïŒ
{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'name'",
"request body must have required property 'description'"
]
}
}
ð é¢é£ããã¥ã¡ã³ãâ
- ãŠãŒã¶ãŒãµãŒãã¹ - ãŠãŒã¶ãŒç®¡çæäœ
- çµç¹ãµãŒãã¹ - çµç¹ç®¡çæäœ
- èªèšŒãµãŒãã¹ - èªèšŒããã³èªå¯
- ãšã©ãŒãã³ããªã³ã° - ãšã©ãŒãã¿ãŒã³ã®çè§£
- ã¹ããŒãã³ã³ããŒãã³ã - ããŒã¿æ€èšŒã®æŠå¿µ
- ã«ã¹ã¿ã ãµãŒãã¹ãã¥ãŒããªã¢ã« - ç¬èªãµãŒãã¹ã®æ§ç¯