ð ã«ããŽãªãµãŒãã¹
ã«ããŽãªãµãŒãã¹ã¯ãã¹ããŒã¿ã¹ç®¡çãåããéå±€ã«ããŽãªã管çããããã®å®å šãª REST API ãæäŸããŸããNodeblocks ã®é¢æ°ååæã¢ãããŒããš MongoDB 飿ºã«ããã補åã«ããŽãªãã³ã³ãã³ãåé¡ãçµç¹æ§é ãæ±ããããèšèšãããŠããŸãã
ð ã¯ã€ãã¯ã¹ã¿ãŒãâ
import express from 'express';
import { middlewares, services, drivers } from '@nodeblocks/backend-sdk';
const { nodeBlocksErrorMiddleware } = middlewares;
const { categoryService } = services;
const { getMongoClient } = drivers;
const client = getMongoClient('mongodb://localhost:27017', 'dev');
express()
.use(
categoryService(
{
categories: client.collection('categories'),
identities: client.collection('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'));
ð ãšã³ããã€ã³ãæŠèŠâ
ã«ããŽãªæäœâ
ã¡ãœãã | ãã¹ | 説æ | èªèšŒ |
---|---|---|---|
POST | /categories | ã«ããŽãªãæ°èŠäœæ | â 管çè |
GET | /categories/:categoryId | IDã§ã«ããŽãªãååŸ | â |
GET | /categories | ã«ããŽãªäžèЧãååŸ | â |
PATCH | /categories/:categoryId | ã«ããŽãªãæŽæ° | â 管çè |
DELETE | /categories/:categoryId | ã«ããŽãªãåé€ | â 管çè |
ã¹ããŒã¿ã¹ç®¡çæäœâ
ã¡ãœãã | ãã¹ | 説æ | èªèšŒ |
---|---|---|---|
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)"
}
ãã£ãŒã«ã詳现â
ãã£ãŒã«ã | å | èªåçæ | å¿ é | 説æ |
---|---|---|---|---|
name | string | â | â | ã«ããŽãªå |
description | string | â | â | ã«ããŽãªã®èª¬æ |
status | string | â | â | ã«ããŽãªã®ã¹ããŒã¿ã¹ïŒ'active'ã'inactive' ãªã©ïŒ |
parent | string | â | â | éå±€æ§é ã®ããã®èŠªã«ããŽãªID |
createdAt | datetime | â | â | äœææ¥æ |
id | string | â | â | äžæèå¥åïŒUUIDïŒ |
updatedAt | datetime | â | â | æçµæŽæ°æ¥æ |
ð æ³šæ: èªåçæãã£ãŒã«ãã¯ãµãŒãã¹åŽã§èšå®ãããäœæ/æŽæ°ãªã¯ãšã¹ãã«å«ããªãã§ãã ããã
parent
ãã£ãŒã«ãã«ããéå±€ã«ããŽãªæ§é ãå¯èœã«ãªããŸãã
ð èªèšŒããããŒâ
ä¿è·ããããšã³ããã€ã³ãã§ã¯ã次ã®ããããŒãå«ããŠãã ããïŒ
Authorization: Bearer <admin_access_token>
x-nb-fingerprint: <device_fingerprint>
â ïž éèŠ: èªå¯æã«ãã£ã³ã¬ãŒããªã³ããæå®ããå ŽåãèªèšŒæžã¿ã®ãã¹ãŠã®ãªã¯ãšã¹ãã§
x-nb-fingerprint
ããããŒãå¿ é ã§ããæ¬ åŠããŠããå Žå㯠401 Unauthorized ãè¿ããŸãã
ð§ APIãšã³ããã€ã³ãâ
1. ã«ããŽãªã®äœæâ
æå®ãããæ å ±ã§æ°ããã«ããŽãªãäœæããŸãã
ãªã¯ãšã¹ã:
- Method:
POST
- Path:
/categories
- ããããŒ:
Content-Type: application/json
Authorization: Bearer <token>
x-nb-fingerprint: <device-fingerprint>
- èªå¯: ãã¢ã©ãŒããŒã¯ã³å¿ é ïŒç®¡çè ïŒ
ãªã¯ãšã¹ãããã£:
ãã£ãŒã«ã | å | å¿ é | 説æ |
---|---|---|---|
name | string | â | ã«ããŽãªå |
description | string | â | ã«ããŽãªã®èª¬æ |
status | string | â | ã«ããŽãªã®ã¹ããŒã¿ã¹ |
parent | string | â | 芪ã«ããŽãªIDïŒéå±€æ§é çšïŒ |
ã¬ã¹ãã³ã¹ããã£:
ãã£ãŒã«ã | å | 説æ |
---|---|---|
name | string | ã«ããŽãªå |
description | string | ã«ããŽãªã®èª¬æ |
status | string | ã«ããŽãªã®ã¹ããŒã¿ã¹ |
parent | string | 芪ã«ããŽãªIDïŒè©²åœããå ŽåïŒ |
createdAt | string | äœææ¥æ |
id | string | ã«ããŽãªäžæID |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªåé©çšïŒname, description, status ãå¿ é ïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒïŒå¿ é
- 管çè ããŒã«å¿ é
ãªã¯ãšã¹ãäŸ:
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
- èªå¯: äžèŠ
URL ãã©ã¡ãŒã¿:
ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
---|---|---|---|
categoryId | string | â | ã«ããŽãªäžæID |
ã¬ã¹ãã³ã¹ããã£:
ãã£ãŒã«ã | å | 説æ |
---|---|---|
name | string | ã«ããŽãªå |
description | string | ã«ããŽãªã®èª¬æ |
status | string | ã«ããŽãªã®ã¹ããŒã¿ã¹ |
parent | string | 芪ã«ããŽãªIDïŒè©²åœããå ŽåïŒ |
createdAt | string | äœææ¥æ |
id | string | ã«ããŽãªäžæID |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: 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
- èªå¯: äžèŠ
ã¯ãšãªãã©ã¡ãŒã¿:
ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
---|---|---|---|
name | string | â | ã«ããŽãªåã§ãã£ã«ã¿ |
description | string | â | 説æã§ãã£ã«ã¿ |
parent | string | â | 芪ã«ããŽãªIDã§ãã£ã«ã¿ |
status | string | â | ã¹ããŒã¿ã¹ã§ãã£ã«ã¿ |
page | number | â | ããŒãžçªå· |
limit | number | â | 1ããŒãžãããã®ä»¶æ° |
ã¬ã¹ãã³ã¹ããã£:
ãã£ãŒã«ã | å | 説æ |
---|---|---|
name | string | ã«ããŽãªå |
description | string | ã«ããŽãªã®èª¬æ |
status | string | ã«ããŽãªã®ã¹ããŒã¿ã¹ |
parent | string | 芪ã«ããŽãªIDïŒè©²åœããå ŽåïŒ |
createdAt | string | äœææ¥æ |
id | string | ã«ããŽãªäžæID |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: 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
[
{
"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"
}
]
4. ã«ããŽãªã®æŽæ°â
éšåæŽæ°ã§æ¢åã®ã«ããŽãªãæŽæ°ããŸãã
ãªã¯ãšã¹ã:
- Method:
PATCH
- Path:
/categories/:categoryId
- ããããŒ:
Content-Type: application/json
- èªå¯: å¿ é ïŒç®¡çè ïŒ
URL ãã©ã¡ãŒã¿:
ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
---|---|---|---|
categoryId | string | â | ã«ããŽãªäžæèå¥å |
ãªã¯ãšã¹ãããã£ïŒå šãã£ãŒã«ãä»»æïŒ:
ãã£ãŒã«ã | å | å¿ é | 説æ |
---|---|---|---|
name | string | â | ã«ããŽãªå |
description | string | â | ã«ããŽãªã®èª¬æ |
parent | string | â | 芪ã«ããŽãªID |
â ïž éèŠ:
status
ãã£ãŒã«ãã¯æŽæ°ãªã¯ãšã¹ãã§ã¯äœ¿çšã§ããŸãããã¹ããŒã¿ã¹å€æŽã¯å°çšã®æå¹å/ç¡å¹åãšã³ããã€ã³ãã䜿çšããŠãã ããã
ã¬ã¹ãã³ã¹ããã£:
ãã£ãŒã«ã | å | 説æ |
---|---|---|
name | string | æŽæ°åŸã®ã«ããŽãªå |
description | string | æŽæ°åŸã®ã«ããŽãªèª¬æ |
status | string | ã«ããŽãªã®ã¹ããŒã¿ã¹ïŒå€æŽãªãïŒ |
parent | string | æŽæ°åŸã®èŠªã«ããŽãªIDïŒè©²åœããå ŽåïŒ |
createdAt | string | äœææ¥æ |
id | string | ã«ããŽãªäžæID |
updatedAt | string | æçµæŽæ°æ¥æ |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: èªåé©çšïŒéšåæŽæ°ãèš±å¯ããããã£ãŒã«ãã«éå®ïŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒããŒã¯ã³ïŒå¿ é
- 管çè ããŒã«å¿ é
- ã«ããŽãªã®ååšãæ€èšŒ
ãªã¯ãšã¹ãäŸ:
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
- èªå¯: å¿ é ïŒç®¡çè ïŒ
URL ãã©ã¡ãŒã¿:
ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
---|---|---|---|
categoryId | string | â | ã«ããŽãªäžæèå¥å |
ã¬ã¹ãã³ã¹ããã£:
ãã£ãŒã«ã | å | 説æ |
---|---|---|
ãªã | - | æåæã¯ã¬ã¹ãã³ã¹ããã£ãªã |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: categoryId ã®ãã¹ãã©ã¡ãŒã¿æ€èšŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒããŒã¯ã³ïŒå¿ é
- 管çè ããŒã«å¿ é
- ã«ããŽãªã®ååšãæ€èšŒ
ãªã¯ãšã¹ãäŸ:
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"
}
}
ð ã¹ããŒã¿ã¹ç®¡çæäœâ
ã«ããŽãªã®ã¹ããŒã¿ã¹ç®¡çã«ç¹åãããšã³ããã€ã³ããæäŸããŸãã
6. ã«ããŽãªã®æå¹åâ
ã«ããŽãªã®ã¹ããŒã¿ã¹ã 'active' ã«èšå®ããŸãã
ãªã¯ãšã¹ã:
- Method:
POST
- Path:
/categories/:categoryId/enable
- èªå¯: å¿ é ïŒç®¡çè ïŒ
URL ãã©ã¡ãŒã¿:
ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
---|---|---|---|
categoryId | string | â | ã«ããŽãªäžæèå¥å |
ã¬ã¹ãã³ã¹ããã£:
ãã£ãŒã«ã | å | 説æ |
---|---|---|
ãªã | - | æåæã¯ã¬ã¹ãã³ã¹ããã£ãªã |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: categoryId ã®ãã¹ãã©ã¡ãŒã¿æ€èšŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒããŒã¯ã³ïŒå¿ é
- 管çè ããŒã«å¿ é
- ã«ããŽãªã®ååšãæ€èšŒ
ãªã¯ãšã¹ãäŸ:
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
- èªå¯: å¿ é ïŒç®¡çè ïŒ
URL ãã©ã¡ãŒã¿:
ãã©ã¡ãŒã¿ | å | å¿ é | 説æ |
---|---|---|---|
categoryId | string | â | ã«ããŽãªäžæèå¥å |
ã¬ã¹ãã³ã¹ããã£:
ãã£ãŒã«ã | å | 説æ |
---|---|---|
ãªã | - | æåæã¯ã¬ã¹ãã³ã¹ããã£ãªã |
ããªããŒã·ã§ã³:
- ã¹ããŒãæ€èšŒ: categoryId ã®ãã¹ãã©ã¡ãŒã¿æ€èšŒ
- ã«ãŒãããªããŒã·ã§ã³:
- èªèšŒæžã¿ãªã¯ãšã¹ãïŒãã¢ã©ãŒããŒã¯ã³ïŒå¿ é
- 管çè ããŒã«å¿ é
- ã«ããŽãªã®ååšãæ€èšŒ
ãªã¯ãšã¹ãäŸ:
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圢åŒã§è¿ãããŸãã
代衚çãªãšã©ãŒã³ãŒãâ
ã¹ããŒã¿ã¹ | ãšã©ãŒã¡ãã»ãŒãž | 説æ |
---|---|---|
400 | Validation Error | ãªã¯ãšã¹ãããã£ã®åœ¢åŒäžæ£ãŸãã¯å¿ é é ç®äžè¶³ |
400 | request body must have required property 'name' | ãªã¯ãšã¹ãããã£ã« name ãååšããªã |
400 | request body must have required property 'description' | ãªã¯ãšã¹ãããã£ã« description ãååšããªã |
400 | request body must have required property 'status' | ãªã¯ãšã¹ãããã£ã« status ãååšããªã |
400 | request body must NOT have additional properties | ãµããŒããããªããã£ãŒã«ããå«ãŸããŠãã |
400 | Failed to create category | 远å IDãè¿ããäœæã«å€±æ |
400 | Failed to update category | 倿Žãæ€åºãããæŽæ°ã«å€±æ |
400 | Failed to delete category | åé€åŠçã«å€±æ |
401 | Authentication failed | èªèšŒããŒã¯ã³ããªã/ç¡å¹ |
401 | token could not be verified | èªå¯ããŒã¯ã³ããªã/ç¡å¹ |
401 | Token fails security check | ããŒã¯ã³ã®ã»ãã¥ãªãã£æ€èšŒã«å€±æ |
403 | User is not authorized to access this resource | æš©éäžè¶³ïŒç®¡çè ã¢ã¯ã»ã¹ãå¿ èŠïŒ |
404 | Category does not exist | 察象ã®ã«ããŽãªãååšããªã |
500 | Failed to create category | äœæäžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
500 | Failed to get category | ååŸäžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
500 | Failed to find categories | äžèЧååŸäžã®DBæ¥ç¶åé¡/ãã£ã«ã¿äžæ£/äºæãã¬å€±æ |
500 | Failed to update category | æŽæ°äžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
500 | Failed to delete category | åé€äžã®DBæ¥ç¶åé¡/äºæãã¬å€±æ |
ãšã©ãŒã¬ã¹ãã³ã¹åœ¢åŒâ
{
"error": {
"message": "Error message description",
"data": ["Additional error details"]
}
}
Validation Errors ã«ã¯è¿œå æ å ±ãå«ãŸããŸãïŒ
{
"error": {
"message": "Validation Error",
"data": [
"request body must have required property 'description'",
"request body must have required property 'status'"
]
}
}
ð é¢é£ããã¥ã¡ã³ãâ
- ãããã¯ããµãŒãã¹ - ãããã¯ã管ç
- 屿§ãµãŒãã¹ - 屿§ç®¡ç
- ãŠãŒã¶ãŒãµãŒãã¹ - ãŠãŒã¶ãŒç®¡ç
- çµç¹ãµãŒãã¹ - çµç¹ç®¡ç
- èªèšŒãµãŒãã¹ - èªèšŒãšèªå¯
- ãšã©ãŒãã³ããªã³ã° - ãšã©ãŒãã¿ãŒã³ã®çè§£
- ã¹ããŒãã³ã³ããŒãã³ã - ããŒã¿æ€èšŒã®æŠå¿µ
- ã«ã¹ã¿ã ãµãŒãã¹ãã¥ãŒããªã¢ã« - ç¬èªãµãŒãã¹ã®æ§ç¯