ð€ ãããã£ãŒã«ãµãŒãã¹
ãããã£ãŒã«ãµãŒãã¹ã¯ããããã£ãŒã«ãšã³ãã£ãã£ã CRUD æäœã§ç®¡çããå®å šãª REST API ã§ããNodeblocks ã®é¢æ°åã³ã³ããžã·ã§ã³ã¢ãããŒãã§æ§ç¯ãããMongoDB ãšã·ãŒã ã¬ã¹ã«çµ±åãããŸãã
ð ã¯ã€ãã¯ã¹ã¿ãŒãâ
import express from 'express';
import {middlewares, services, drivers} from '@nodeblocks/backend-sdk';
const {nodeBlocksErrorMiddleware} = middlewares;
const {profileService} = services;
const {withMongo} = drivers;
const connectToDatabase = withMongo('mongodb://localhost:27017/?authSource=admin', 'dev', 'user', 'password');
express()
.use(
profileService(
{
...(await connectToDatabase('profiles')),
...(await connectToDatabase('identities')),
...(await connectToDatabase('organizations')),
...(await connectToDatabase('products')),
},
{
authSecrets: {authEncSecret: 'your-encryption-secret', authSignSecret: 'your-signing-secret'},
authMode: 'bearer', // ãŸã㯠'cookie'
identity: {typeIds: {admin: '100', guest: '000', regular: '001'}},
},
// ä»»æã®ç¬¬3åŒæ°: { fileStorageDriver }ãã¢ãã¿ãŒã¢ããããŒã URL ãš URL æ£èŠåã«å¿
èŠ
),
)
.use(nodeBlocksErrorMiddleware())
.listen(8089);
ð ãšã³ããã€ã³ãäžèЧâ
| ã¡ãœãã | ãã¹ | 説æ | èªå¯ |
|---|---|---|---|
POST | /profiles | ãããã£ãŒã«ãäœæ | ãã¢ã©ãŒããŒã¯ã³ |
GET | /profiles/:profileId | ID ã§ãããã£ãŒã«ãååŸ | 管çè ãŸãã¯ææè |
GET | /profiles | ãããã£ãŒã«ãäžèЧïŒãã£ã«ã¿ | 管çè ã®ã¿ |
GET | /profiles/identities/:identityId | identity ID ã§ååŸ | æ¬äººã®ã¿ |
PATCH | /profiles/:profileId | ãããã£ãŒã«ãæŽæ° | 管çè ãŸãã¯ææè |
DELETE | /profiles/:profileId | ãããã£ãŒã«ãåé€ | 管çè ãŸãã¯ææè |
ãã¡ã€ã«ã¢ããããŒãæäœâ
| ã¡ãœãã | ãã¹ | 説æ |
|---|---|---|
GET | /profiles/:profileId/avatar-upload-url | ã¢ãã¿ãŒçšã®çœ²åä»ãã¢ããããŒã URL ãååŸ |
ãããã£ãŒã«ãã©ããŒæäœâ
| ã¡ãœãã | ãã¹ | 説æ |
|---|---|---|
PUT | /profiles/:profileId/profile-follows/:followProfileId | ãããã£ãŒã«ã®ãã©ããŒãäœæ |
DELETE | /profiles/:profileId/profile-follows/:followProfileId | ãããã£ãŒã«ã®ãã©ããŒãåé€ |
GET | /profiles/:profileId/followers | ããŒãžããŒã·ã§ã³ä»ãã®ãã©ãã¯ãŒãååŸ |
çµç¹ãã©ããŒæäœâ
| ã¡ãœãã | ãã¹ | 説æ |
|---|---|---|
PUT | /profiles/:profileId/organization-follows/:followOrganizationId | çµç¹ãã©ããŒãäœæ |
DELETE | /profiles/:profileId/organization-follows/:followOrganizationId | çµç¹ãã©ããŒãåé€ |
ååãããæäœâ
| ã¡ãœãã | ãã¹ | 説æ |
|---|---|---|
PUT | /profiles/:profileId/product-likes/:likeProductId | ååãžã®ããããäœæ |
DELETE | /profiles/:profileId/product-likes/:likeProductId | ååãžã®ããããåé€ |
ðïž ãšã³ãã£ãã£ã¹ããŒãâ
{
"id": "string",
"createdAt": "string (datetime)",
"updatedAt": "string (datetime)",
"identityId": "string",
"name": "string",
"avatar": {"url": "string", "type": "string"},
"profileFollows": [{"followProfileId": "string"}],
"organizationFollows": [{"followOrganizationId": "string"}],
"productLikes": [{"likeProductId": "string"}]
}
ãã£ãŒã«ã詳现â
| ãã£ãŒã«ã | å | èªåçæ | å¿ é | 説æ |
|---|---|---|---|---|
id | string | â | â | äžæèå¥åïŒUUIDïŒ |
createdAt / updatedAt | datetime | â | â | äœæïŒæçµæŽæ°æ¥æ |
identityId | string | â | â | çŽã¥ãã¢ã€ãã³ãã£ã㣠ID |
name | string | â | â | 衚瀺å |
avatar | object ãŸã㯠null | â | â | ã¢ãã¿ãŒã®ã¹ãã¬ãŒãžã¡ã¿ããŒã¿ |
profileFollows | array | â | â | ãããã£ãŒã«ãã©ããŒïŒç©ºé åã§åæåïŒ |
organizationFollows | array | â | â | çµç¹ãã©ããŒïŒç©ºé åã§åæåïŒ |
productLikes | array | â | â | ååãããïŒç©ºé åã§åæåïŒ |
泚: èªåçæãã£ãŒã«ãã¯äœæïŒæŽæ°ãªã¯ãšã¹ãã«å«ããŸããã
avatarã¯nullãŸãã¯ã¹ãã¬ãŒãžã¡ã¿ããŒã¿ãæã€ãªããžã§ã¯ãã§ãã
ð èªèšŒããããŒâ
Authorization: Bearer <access_token>
x-nb-fingerprint: <device_fingerprint>
èªå¯æã«ãã£ã³ã¬ãŒããªã³ããæå®ããå Žåãx-nb-fingerprint ã¯ãã¹ãŠã®èªèšŒæžã¿ãªã¯ãšã¹ãã§å¿
é ã§ããauthMode: 'cookie' ã§ã¯ Bearer ããããŒã®ä»£ããã« Cookie ããã¢ã¯ã»ã¹ããŒã¯ã³ãèªã¿åãããããã¹ãã¢ããªã§ cookie-parser ãç»é²ããŠãã ããã
ð§ API ãšã³ããã€ã³ãâ
1. ãããã£ãŒã«ã®äœæâ
POST /profiles 㯠identityId ãš nameïŒå¿
é ïŒãããã³ä»»æã® avatar ãåãåããŸãã察象 identity ã®ç®¡çè
ãŸãã¯æ¬äººã§ããå¿
èŠããããŸããæåæã¯äœææžã¿ãããã£ãŒã«ãšç©ºã®ãã©ããŒïŒãããé
åãè¿ããŸãã
2. ID ã«ãããããã£ãŒã«ååŸâ
GET /profiles/:profileId ã¯ã管çè
ãŸãã¯å¯Ÿè±¡ãããã£ãŒã«ã®ææè
ã«ãããã£ãŒã«ãè¿ããŸãã
3. ãããã£ãŒã«äžèЧâ
GET /profiles ã¯ç®¡çè
å°çšã§ããã¹ããŒãã§å®çŸ©ããããã£ã«ã¿ãŒããã³ããŒãžããŒã·ã§ã³çšã¯ãšãªãã©ã¡ãŒã¿ãæå®ã§ããŸãã
4. ãããã£ãŒã«ã®æŽæ°â
PATCH /profiles/:profileId ã¯ã管çè
ãŸãã¯ææè
ã衚瀺åãšã¢ãã¿ãŒæ
å ±ãéšåæŽæ°ããããã®ãšã³ããã€ã³ãã§ããidentity ã®é¢é£ä»ããèªåçæãã£ãŒã«ãã¯å€æŽã§ããŸããã
5. ãããã£ãŒã«ã®åé€â
DELETE /profiles/:profileId ã¯ã管çè
ãŸãã¯ææè
ããããã£ãŒã«ãåé€ããŸããæåæã¯ 204 No Content ãè¿ããŸãã
6. ã¢ãã¿ãŒã¢ããããŒã URL ã®ååŸâ
GET /profiles/:profileId/avatar-upload-url ã¯ãææè
ãŸãã¯ç®¡çè
ã«ã¢ãã¿ãŒã¢ããããŒãçšã®çœ²åä»ã URL ãè¿ããŸãããµãŒãã¹ã®ç¬¬3åŒæ°ã« fileStorageDriver ãæå®ããå¿
èŠããããŸãã
7. identity ID ã«ãããããã£ãŒã«æ€çŽ¢â
GET /profiles/identities/:identityId ã¯æå® identity ã«é¢é£ãããããã£ãŒã«ãè¿ããŸããèªå·±ã¢ã¯ã»ã¹ã®ã¿èš±å¯ãããŸãã
8. ãããã£ãŒã«ãã©ããŒã®äœæâ
PUT /profiles/:profileId/profile-follows/:followProfileId ã§ãã©ããŒãäœæããŸãã
9. ãããã£ãŒã«ãã©ããŒã®åé€â
DELETE /profiles/:profileId/profile-follows/:followProfileId ã§ãã©ããŒãè§£é€ããŸãã
10. ãããã£ãŒã«ãã©ãã¯ãŒã®ååŸâ
GET /profiles/:profileId/followers ã¯ãã©ãã¯ãŒãããŒãžããŒã·ã§ã³ä»ãã§è¿ããŸãã
11. çµç¹ãã©ããŒã®äœæâ
PUT /profiles/:profileId/organization-follows/:followOrganizationId ã§çµç¹ããã©ããŒããŸãã
12. çµç¹ãã©ããŒã®åé€â
DELETE /profiles/:profileId/organization-follows/:followOrganizationId ã§çµç¹ãã©ããŒãè§£é€ããŸãã
13. ååãããã®äœæâ
PUT /profiles/:profileId/product-likes/:likeProductId ã§ååã«ããããä»ããŸãã
14. ååãããã®åé€â
DELETE /profiles/:profileId/product-likes/:likeProductId ã§ååãžã®ããããåé€ããŸãã
ãããã£ãŒã« API ãªãã¡ã¬ã³ã¹:
| æäœ | ãã¹ | èªå¯ | æåæ |
|---|---|---|---|
| ãããã£ãŒã«äœæ | POST /profiles | 管çè ãŸãã¯å¯Ÿè±¡ identity ã®æ¬äºº | 200 OK |
| ãããã£ãŒã«ååŸ | GET /profiles/:profileId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 200 OK |
| ãããã£ãŒã«äžèЧ | GET /profiles | 管çè ã®ã¿ | 200 OK |
| ãããã£ãŒã«æŽæ° | PATCH /profiles/:profileId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 200 OK |
| ãããã£ãŒã«åé€ | DELETE /profiles/:profileId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 204 No Content |
| ã¢ãã¿ãŒ URL | GET /profiles/:profileId/avatar-upload-url | 管çè ãŸãã¯ãããã£ãŒã«ææè | 200 OK |
| identity 奿€çŽ¢ | GET /profiles/identities/:identityId | æ¬äººã®ã¿ | 200 OK |
| ãããã£ãŒã«ããã©ã㌠| PUT /profiles/:profileId/profile-follows/:followProfileId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 204 No Content |
| ãããã£ãŒã«ã®ãã©ããŒãè§£é€ | DELETE /profiles/:profileId/profile-follows/:followProfileId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 204 No Content |
| ãã©ãã¯ãŒååŸ | GET /profiles/:profileId/followers | 管çè ãŸãã¯ãããã£ãŒã«ææè | 200 OK |
| çµç¹ããã©ã㌠| PUT /profiles/:profileId/organization-follows/:followOrganizationId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 204 No Content |
| çµç¹ã®ãã©ããŒãè§£é€ | DELETE /profiles/:profileId/organization-follows/:followOrganizationId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 204 No Content |
| ååã«ããã | PUT /profiles/:profileId/product-likes/:likeProductId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 204 No Content |
| ååã®ããããè§£é€ | DELETE /profiles/:profileId/product-likes/:likeProductId | 管çè ãŸãã¯ãããã£ãŒã«ææè | 204 No Content |
| ãããã£ãŒã«ãã£ãŒã«ã | å | å¿ é | 説æ |
|---|---|---|---|
id | string | èªåçæ | äžæã®ãããã£ãŒã«èå¥å |
identityId | string | äœææã«å¿ é | é¢é£ä»ããã¢ã€ãã³ãã£ã㣠ID |
name | string | äœææã«å¿ é | 衚瀺å |
avatar | object ãŸã㯠null | â | ã¢ãã¿ãŒã®ã¹ãã¬ãŒãžã¡ã¿ããŒã¿ |
profileFollows | array | èªåçæ | ãããã£ãŒã«ãã©ããŒã®é å |
organizationFollows | array | èªåçæ | çµç¹ãã©ããŒã®é å |
productLikes | array | èªåçæ | ååãããã®é å |
createdAt | string | èªåçæ | äœææ¥æ |
updatedAt | string | èªåçæ | æçµæŽæ°æ¥æ |
äœæãªã¯ãšã¹ãã§ã¯ identityId ãš name ãå¿
èŠã§ããavatar ã¯ä»»æã§ã{ objectId, type } ãæå®ã§ããŸãã远å ããããã£ã¯èš±å¯ãããŸãããæŽæ°ã§ã¯ name ãš avatar ã®ã¿å€æŽã§ãããªã¯ãšã¹ãããã£èªäœã¯ç©ºã«ã§ããŸããã
curl -X POST {{host}}/profiles \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{"identityId":"811ff0a3-a26f-447b-b68a-dd83ea4000b9","name":"John Doe"}'
HTTP/1.1 200 OK
Content-Type: application/json
{"id":"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2","identityId":"811ff0a3-a26f-447b-b68a-dd83ea4000b9","name":"John Doe","profileFollows":[],"organizationFollows":[],"productLikes":[],"createdAt":"2024-05-28T09:41:22.552Z","updatedAt":"2024-05-28T09:41:22.552Z"}
curl {{host}}/profiles/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2 \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 200 OK
Content-Type: application/json
{"id":"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2","identityId":"811ff0a3-a26f-447b-b68a-dd83ea4000b9","name":"John Doe Updated","avatar":null,"profileFollows":[],"organizationFollows":[],"productLikes":[],"createdAt":"2024-05-28T09:41:22.552Z","updatedAt":"2024-05-28T09:41:22.552Z"}
ãããã£ãŒã«äžèЧã§ã¯ identityIdãnameãpageïŒ1ïœ1000ïŒãlimitïŒ1ïœ50ïŒã䜿çšããŠãã£ã«ã¿ãŒã§ããŸããã¬ã¹ãã³ã¹ã¯ data é
åãš metadata.pagination ãè¿ããŸãã
curl "{{host}}/profiles?name=John&page=1&limit=20" \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 200 OK
Content-Type: application/json
{"data":[{"id":"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2","identityId":"811ff0a3-a26f-447b-b68a-dd83ea4000b9","name":"John Doe","avatar":null,"profileFollows":[],"organizationFollows":[],"productLikes":[]}],"metadata":{"pagination":{"page":1,"limit":20,"total":1,"totalPages":1,"hasNext":false,"hasPrev":false}}}
curl -X PATCH {{host}}/profiles/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access-token>" \
-d '{"name":"John Doe Updated"}'
HTTP/1.1 200 OK
Content-Type: application/json
{"id":"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2","name":"John Doe Updated","avatar":null}
curl -X DELETE {{host}}/profiles/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2 \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 204 No Content
ã¢ãã¿ãŒã¢ããããŒã URL ã§ã¯ contentType ãš contentLength ãå¿
èŠã§ããèš±å¯ãããç»åã¿ã€ã㯠JPEGãPNGãWebPãGIFãSVGãAVIFãBMPãã¢ã€ã³ã³ãTIFFãHEIFãHEIC ã§ããµã€ãºäžé㯠10 MB ã§ãã
curl "{{host}}/profiles/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/avatar-upload-url?contentType=image/jpeg&contentLength=524288" \
-H "Authorization: Bearer <access-token>"
{"objectId":"7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2","url":"https://storage.googleapis.com/bucket/avatars/...&X-Goog-Expires=900&X-Goog-Signature=..."}
identity 奿€çŽ¢ã¯æ¬äººã®ã¿ãå®è¡ã§ããŸããpage ã®æ¢å®å€ã¯ 1ãlimit ã®æ¢å®å€ã¯ 10 ã§ããã¢ãã¿ãŒãããå Žåã¯ãã¹ãã¬ãŒãžåç
§ã眲åä»ã URL ã«æ£èŠåããŸãã
curl "{{host}}/profiles/identities/identity-123?page=1&limit=10" \
-H "Authorization: Bearer <access-token>"
{"data":[{"id":"profile-123","identityId":"identity-123","name":"John Doe","avatar":{"url":"https://cdn.example.com/avatars/profile-123.jpg","type":"image/jpeg"},"profileFollows":[],"organizationFollows":[],"productLikes":[]}],"metadata":{"pagination":{"hasNext":false,"hasPrev":false,"limit":10,"page":1,"total":1,"totalPages":1}}}
ãã©ããŒããã³ãããæäœã«ã¯ãªã¯ãšã¹ãããã£ã¯äžèŠã§ããé¢é£ãããããã£ãŒã«ãçµç¹ããŸãã¯ååãååšããããšãæ€èšŒããŸããéè€ãããããã£ãŒã«ãã©ããŒãçµç¹ãã©ããŒãååããã㯠409 Conflict ã«ãªããŸãã
curl -X PUT "{{host}}/profiles/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/profile-follows/f8c9b2a1-3d4e-5f6g-7h8i-9j0k1l2m3n4o5p" \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 204 No Content
curl -X DELETE "{{host}}/profiles/7edfb95f-0ab6-4adc-a6e1-2a86a2f1e6d2/profile-follows/f8c9b2a1-3d4e-5f6g-7h8i-9j0k1l2m3n4o5p" \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 204 No Content
ãã©ãã¯ãŒååŸã¯ GET /profiles/:profileId/followers ã䜿çšããŸããpage ãš limit ã§ããŒãžããŒã·ã§ã³ãæå®ãããã©ãã¯ãŒãããã£ãŒã«ã® data ãš metadata.pagination ãåãåããŸãã
curl "{{host}}/profiles/profile-123/followers?page=1&limit=20" \
-H "Authorization: Bearer <access-token>"
{"data":[{"id":"follower-456","name":"Jane Smith","avatar":{"url":"https://storage.example.com/avatars/avatar.png","type":"image/png"}}],"metadata":{"pagination":{"page":1,"limit":20,"total":1,"totalPages":1,"hasNext":false,"hasPrev":false}}}
curl -X PUT "{{host}}/profiles/profile-123/organization-follows/org-456" \
-H "Authorization: Bearer <access-token>"
curl -X DELETE "{{host}}/profiles/profile-123/organization-follows/org-456" \
-H "Authorization: Bearer <access-token>"
curl -X PUT "{{host}}/profiles/profile-123/product-likes/product-456" \
-H "Authorization: Bearer <access-token>"
curl -X DELETE "{{host}}/profiles/profile-123/product-likes/product-456" \
-H "Authorization: Bearer <access-token>"
HTTP/1.1 204 No Content
ãšã©ãŒåŠç: ç¡å¹ãªãªã¯ãšã¹ã㯠400ãèªèšŒããŒã¯ã³ããªããç¡å¹ãªå Žå㯠401ãææè
ãŸãã¯ç®¡çè
æš©éããªãå Žå㯠403ããããã£ãŒã«ãŸãã¯é¢é£ãšã³ãã£ãã£ãèŠã€ãããªãå Žå㯠404ãéè€ãã©ããŒïŒããã㯠409ãããŒã¿ããŒã¹ãŸãã¯ã¢ãã¿ãŒåŠçã®å€±æã¯ 500 ãè¿ããŸãã
{"error":{"message":"Validation Error","data":["request body must have required property 'identityId'","request body must have required property 'name'"]}}
{"error":{"message":"token could not be verified"}}
{"error":{"message":"Identity is not authorized to access this resource"}}
{"error":{"message":"Profile not found"}}
{"error":{"message":"Failed to update profile"}}
詳现ãªãªã¯ãšã¹ãããã³ã¬ã¹ãã³ã¹å¥çŽ:
| ãšã³ããã€ã³ã | ãªã¯ãšã¹ãé ç® | å | å¿ é | å¥çŽ |
|---|---|---|---|---|
| äœæ | identityId | string | â | 察象ã¢ã€ãã³ãã£ãã£ã®èå¥å |
| äœæ | name | string | â | ãããã£ãŒã«ã®è¡šç€ºå |
| äœæ | avatar | object/null | â | { objectId, type } ãŸã㯠null |
| äœæå¿ç | id | string | â | çææžã¿ãããã£ãŒã« ID |
| äœæå¿ç | identityId | string | â | é¢é£ä»ããã¢ã€ãã³ãã£ã㣠|
| äœæå¿ç | profileFollows | array | â | 空é åã§åæåããããã©ã㌠|
| äœæå¿ç | organizationFollows | array | â | 空é åã§åæåãããçµç¹ãã©ã㌠|
| äœæå¿ç | productLikes | array | â | 空é åã§åæåãããååããã |
| ååŸ | profileId | string | â | ãã¹ã§æå®ãããããã£ãŒã« ID |
| ååŸå¿ç | avatar | object/null | â | ã¢ãã¿ãŒæ å ±ãŸã㯠null |
| äžèЧ | identityId | string | â | ã¢ã€ãã³ãã£ã㣠ID ã§ã®ãã£ã«ã¿ãŒ |
| äžèЧ | name | string | â | 衚瀺åã§ã®ãã£ã«ã¿ãŒ |
| äžèЧ | page | number | â | 1ïœ1000 ã®ããŒãžçªå· |
| äžèЧ | limit | number | â | 1ïœ50 ã®ããŒãžãµã€ãº |
| äžèЧå¿ç | data | array | â | ãããã£ãŒã«ãªããžã§ã¯ãã®é å |
| äžèЧå¿ç | 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 | â | åããŒãžã®æç¡ |
| æŽæ° | profileId | string | â | æŽæ°å¯Ÿè±¡ã®ãããã£ãŒã« ID |
| æŽæ° | name | string | â | æ°ãã衚瀺å |
| æŽæ° | avatar | object/null | â | æ°ããã¢ãã¿ãŒæ å ±ãŸã㯠null |
| æŽæ°å¿ç | updatedAt | string | â | æŽæ°æ¥æ |
| åé€ | profileId | string | â | åé€å¯Ÿè±¡ã®ãããã£ãŒã« ID |
| ã¢ãã¿ãŒ URL | profileId | string | â | 察象ãããã£ãŒã« ID |
| ã¢ãã¿ãŒ URL | contentType | string | â | ç»å MIME ã¿ã€ã |
| ã¢ãã¿ãŒ URL | contentLength | number | â | ãã€ãåäœã®ãã¡ã€ã«ãµã€ãº |
| ã¢ãã¿ãŒ URL å¿ç | objectId | string | â | çææžã¿ã¹ãã¬ãŒãžãªããžã§ã¯ã ID |
| ã¢ãã¿ãŒ URL å¿ç | url | string | â | äžæçãªçœ²åä»ã URL |
| identity æ€çŽ¢ | identityId | string | â | æ¬äººãæ€çŽ¢ããã¢ã€ãã³ãã£ã㣠ID |
| identity æ€çŽ¢ | page | number | â | æ¢å®å€ã¯ 1 |
| identity æ€çŽ¢ | limit | number | â | æ¢å®å€ã¯ 10 |
| ãã©ããŒäœæ | profileId | string | â | ãã©ããŒå ãããã£ãŒã« ID |
| ãã©ããŒäœæ | followProfileId | string | â | ãã©ããŒå ãããã£ãŒã« ID |
| ãã©ããŒåé€ | profileId | string | â | ãã©ããŒå ãããã£ãŒã« ID |
| ãã©ããŒåé€ | followProfileId | string | â | ãã©ããŒå ãããã£ãŒã« ID |
| ãã©ãã¯ãŒäžèЧ | profileId | string | â | ãã©ãã¯ãŒãååŸãããããã£ãŒã« ID |
| ãã©ãã¯ãŒäžèЧ | page | number | â | ããŒãžçªå· |
| ãã©ãã¯ãŒäžèЧ | limit | number | â | ããŒãžãµã€ãº |
| çµç¹ãã©ã㌠| profileId | string | â | æäœãè¡ããããã£ãŒã« ID |
| çµç¹ãã©ã㌠| followOrganizationId | string | â | ãã©ããŒå çµç¹ ID |
| çµç¹ãã©ããŒåé€ | profileId | string | â | æäœãè¡ããããã£ãŒã« ID |
| çµç¹ãã©ããŒåé€ | followOrganizationId | string | â | ãã©ããŒè§£é€ããçµç¹ ID |
| ååããã | profileId | string | â | æäœãè¡ããããã£ãŒã« ID |
| ååããã | likeProductId | string | â | ããããä»ããåå ID |
| ååãããåé€ | profileId | string | â | æäœãè¡ããããã£ãŒã« ID |
| ååãããåé€ | likeProductId | string | â | ããããè§£é€ããåå ID |
| ãšã©ãŒ | 400 | HTTP status | - | ç¡å¹ãªãªã¯ãšã¹ããŸãã¯ç©ºã®æŽæ°ãã㣠|
| ãšã©ãŒ | 401 | HTTP status | - | ããŒã¯ã³ããªãããŸãã¯ç¡å¹ |
| ãšã©ãŒ | 403 | HTTP status | - | ææè ãŸãã¯ç®¡çè ã®æš©éããªã |
| ãšã©ãŒ | 404 | HTTP status | - | ãããã£ãŒã«ãŸãã¯é¢é£ãšã³ãã£ãã£ããªã |
| ãšã©ãŒ | 409 | HTTP status | - | éè€ãããã©ããŒãŸãã¯ããã |
| ãšã©ãŒ | 500 | HTTP status | - | ããŒã¿ã¹ãã¢ãŸãã¯ã¢ãã¿ãŒåŠçã®å€±æ |
以äžã®äŸã¯ãåä¿è·æäœã§ Authorization ããããŒã䜿çšãã圢ã瀺ããŸããcookie ã¢ãŒãã§ã¯åãã¢ã¯ã»ã¹ããŒã¯ã³ã accessToken Cookie ã«èšå®ããŸãããã£ã³ã¬ãŒããªã³ãã䌎ã£ãŠèªå¯ããã¯ã©ã€ã¢ã³ãã¯ãä¿è·ããããªã¯ãšã¹ãã« x-nb-fingerprint ãå«ããŸãã
curl {{host}}/profiles -H "Authorization: Bearer <access-token>"
curl "{{host}}/profiles?identityId=identity-123" -H "Authorization: Bearer <access-token>"
curl "{{host}}/profiles?name=John" -H "Authorization: Bearer <access-token>"
curl "{{host}}/profiles?page=1&limit=20" -H "Authorization: Bearer <access-token>"
curl -X PATCH {{host}}/profiles/profile-123 -H "Content-Type: application/json" -H "Authorization: Bearer <access-token>" -d '{"avatar":null}'
curl -X DELETE {{host}}/profiles/profile-123 -H "Authorization: Bearer <access-token>"
curl "{{host}}/profiles/profile-123/avatar-upload-url?contentType=image/png&contentLength=1048576" -H "Authorization: Bearer <access-token>"
curl "{{host}}/profiles/identities/identity-123" -H "Authorization: Bearer <access-token>"
curl -X PUT "{{host}}/profiles/profile-123/profile-follows/profile-456" -H "Authorization: Bearer <access-token>"
curl -X DELETE "{{host}}/profiles/profile-123/profile-follows/profile-456" -H "Authorization: Bearer <access-token>"
curl "{{host}}/profiles/profile-123/followers?page=1&limit=20" -H "Authorization: Bearer <access-token>"
curl -X PUT "{{host}}/profiles/profile-123/organization-follows/org-456" -H "Authorization: Bearer <access-token>"
curl -X DELETE "{{host}}/profiles/profile-123/organization-follows/org-456" -H "Authorization: Bearer <access-token>"
curl -X PUT "{{host}}/profiles/profile-123/product-likes/product-456" -H "Authorization: Bearer <access-token>"
curl -X DELETE "{{host}}/profiles/profile-123/product-likes/product-456" -H "Authorization: Bearer <access-token>"
HTTP/1.1 204 No Content
HTTP/1.1 400 Bad Request
Content-Type: application/json
HTTP/1.1 401 Unauthorized
Content-Type: application/json
HTTP/1.1 403 Forbidden
Content-Type: application/json
HTTP/1.1 404 Not Found
Content-Type: application/json
HTTP/1.1 409 Conflict
Content-Type: application/json
HTTP/1.1 500 Internal Server Error
Content-Type: application/json
ãããã£ãŒã«äœæã§ã¯ã察象ã¢ã€ãã³ãã£ãã£ãååšããããšã確èªããŠãã ããã
ãããã£ãŒã«ååŸã§ã¯ãè¿ããã identityId ãèªèšŒæžã¿ãŠãŒã¶ãŒã®ã³ã³ããã¹ããšæ¯èŒã§ããŸãã
ãããã£ãŒã«äžèЧã¯ç®¡ççšã®äžèЧç»é¢ã«é©ããŠããŸãã
ãããã£ãŒã«äžèЧã®ãã£ã«ã¿ãŒã¯çµã¿åãããŠäœ¿çšã§ããŸãã
ãããã£ãŒã«äžèЧã®å€§ããªçµæã»ããã§ã¯ hasNext ã䜿çšããŠè¿œå èªã¿èŸŒã¿ãå®è£
ã§ããŸãã
ãããã£ãŒã«æŽæ°ã§ã¯ identity ã®é¢é£ä»ãã倿Žã§ããŸããã
ãããã£ãŒã«æŽæ°ã§ã¯èªåçææ¥æã倿Žã§ããŸããã
ãããã£ãŒã«åé€åŸã¯é¢é£ç»é¢ã§ååšããªããããã£ãŒã«ãé©åã«åŠçããŠãã ããã
ã¢ãã¿ãŒ URL ã¯æéä»ãã®ãããååŸåŸããã«ã¢ããããŒãããŠãã ããã
ã¢ãã¿ãŒ URL ã®ãªããžã§ã¯ã ID ã¯ãããã£ãŒã«æŽæ°ã® avatar åç
§ã«äœ¿çšããŸãã
ã¢ãã¿ãŒã®åã¯ã¢ããããŒãæã«æå®ããç»å MIME ã¿ã€ããšäžèŽãããŠãã ããã
identity 奿€çŽ¢ã¯ã¢ãã€ã«ã¢ããªã§èªèšŒæžã¿ãŠãŒã¶ãŒã®ãããã£ãŒã«ã衚瀺ããçšéã«äœ¿ããŸãã
identity 奿€çŽ¢ã¯ Web ã¢ããªã±ãŒã·ã§ã³ã®ãããã£ãŒã«ç®¡çç»é¢ã«ã䜿ããŸãã
ãããã£ãŒã«ãã©ããŒã¯ãœãŒã·ã£ã«ãããã¯ãŒã¯æ©èœã®é¢ä¿ãäœæããŸãã
ãããã£ãŒã«ãã©ããŒã¯åã察象ãžã®éè€äœæã鲿¢ããŸãã
ãã©ããŒè§£é€ã¯æ¢åã®ãã©ããŒé¢ä¿ãåé€ããŸãã
ãã©ãã¯ãŒäžèЧã¯ãã©ãã¯ãŒã®ãããã£ãŒã«æ
å ±ãããŒãžããŒã·ã§ã³ä»ãã§è¿ããŸãã
çµç¹ãã©ããŒã¯ãããã£ãŒã«ãšçµç¹ã®é¢ä¿ãäœæããŸãã
ååãããã¯ãããã£ãŒã«ãšååã®é¢ä¿ãäœæããŸãã
çµç¹ãŸãã¯ååãèŠã€ãããªãå Žåã察å¿ããæäœã¯å€±æããŸãã
ææè
ã¢ã¯ã»ã¹ã§ã¯æäœå
ãããã£ãŒã«ã® identity ã確èªããŸãã
管çè
ã¢ã¯ã»ã¹ã§ã¯ identity ã®çš®å¥èšå®ã䜿çšããŸãã
ä¿è·ãããã«ãŒã㯠bearer ã¢ãŒããŸã㯠cookie ã¢ãŒãã§èªèšŒããŸãã
cookie ã¢ãŒãã䜿çšãããã¹ãã¢ããªã±ãŒã·ã§ã³ã§ã¯ cookie-parser ãç»é²ããŸãã
ã¢ãã¿ãŒæ£èŠåã«ã¯ä»»æã® fileStorageDriver ãå¿
èŠã§ãã
ã¢ãã¿ãŒ URL ã䜿çšããæ©èœã§ã¯ fileStorageDriver ããµãŒãã¹ã®ç¬¬ 3 åŒæ°ã§æž¡ããŸãã
profiles ããŒã¿ã¹ãã¢ã¯ãã¹ãŠã®ãããã£ãŒã«æäœã«å¿
èŠã§ãã
identities ããŒã¿ã¹ãã¢ã¯èªèšŒãšææè
æ€èšŒã«å¿
èŠã§ãã
organizations ããŒã¿ã¹ãã¢ã¯çµç¹ãã©ããŒã®æ€èšŒã«å¿
èŠã§ãã
products ããŒã¿ã¹ãã¢ã¯ååãããã®æ€èšŒã«å¿
èŠã§ãã
authSecrets ã«ã¯ JWT ã®æå·åããã³çœ²åã·ãŒã¯ã¬ãããèšå®ããŸãã
identity.typeIds ã¯ç®¡çè
ãã²ã¹ããéåžžãŠãŒã¶ãŒã®çš®å¥ãå®çŸ©ã§ããŸãã
organization.roles ã¯çµç¹æäœã«å¿
èŠãªããŒã«ãå®çŸ©ã§ããŸãã
authMode ãæå®ããªãå Žå㯠bearer åäœã«ãªããŸãã
authMode: 'cookie' ã§ã¯ã¢ã¯ã»ã¹ããŒã¯ã³ã Cookie ããèªã¿åããŸãã
ç¡å¹ãªãããã£ãŒã« ID ã¯ãã¹ãã©ã¡ãŒã¿æ€èšŒã§æåŠãããŸãã
ç¡å¹ãªããŒãžçªå·ãŸãã¯ããŒãžãµã€ãºã¯ã¯ãšãªæ€èšŒã§æåŠãããŸãã
äœæãªã¯ãšã¹ãã®äœåãªããããã£ã¯ã¹ããŒãæ€èšŒã§æåŠãããŸãã
æŽæ°ãªã¯ãšã¹ãã®äœåãªããããã£ã¯ã¹ããŒãæ€èšŒã§æåŠãããŸãã
ç©ºã®æŽæ°ãªã¯ãšã¹ã㯠Request body is required ãšã©ãŒã«ãªããŸãã
éè€ãã©ããŒã¯ã¯ã©ã€ã¢ã³ãã§æåãšããŠæ±ãããç«¶åãšããŠè¡šç€ºããŠãã ããã
API ããè¿ããšã©ãŒã¡ãã»ãŒãžã¯æè¡ãªãã©ã«ãšããŠå€æŽããªãã§ãã ããã
ããŒãžããŒã·ã§ã³ã®æ¢å®å€ã¯ endpoint ããšã«ç°ãªãå ŽåããããŸãã
ã¢ãã¿ãŒãæããªããããã£ãŒã«ã§ã¯ avatar ã null ãŸãã¯çç¥ã«ãªããŸãã
ãã©ããŒããã³ãããã®æåã¬ã¹ãã³ã¹ã«ã¯æ¬æããããŸããã
ã¢ããªã±ãŒã·ã§ã³ã§ã¯ 204 No Content ãæåãšããŠåŠçããŠãã ããã
眲åä»ãã¢ãã¿ãŒ URL ãæ°žç¶çãªå
¬é URL ãšããŠæ±ããªãã§ãã ããã
ãããã£ãŒã« API ã®åŒã³åºãã§ã¯ HTTPS ã䜿çšããŠãã ããã
ãã©ããŒããã©ãã¯ãŒãããã³ååãããã®å¿çäŸ:
ãããã£ãŒã«ãã©ããŒã¯ãåããããã£ãŒã«ãäºéã«ãã©ããŒããããšãé²ããŸãã
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error":{"message":"Profile is already being followed"}}
ãã©ããŒè§£é€ã®å¯Ÿè±¡ãååšããªãå Žåã¯æ¬¡ã®ãšã©ãŒãè¿ããŸãã
HTTP/1.1 404 Not Found
Content-Type: application/json
{"error":{"message":"Profile follow not found"}}
ãã©ãã¯ãŒäžèЧã¯ã¢ãã¿ãŒãæã€å Žåã« URL ãšã¿ã€ããå«ããŸãã
{"data":[{"id":"user-456","name":"John Doe","avatar":{"url":"https://storage.example.com/avatars/avatar123.png","type":"image/png"}},{"id":"user-789","name":"Jane Smith","avatar":{"url":"https://storage.example.com/avatars/avatar456.jpg","type":"image/jpeg"}}],"metadata":{"pagination":{"page":1,"limit":20,"total":50,"totalPages":3,"hasNext":true,"hasPrev":false}}}
ãã©ãã¯ãŒãååŸãããããã£ãŒã«ããªãå Žåã¯æ¬¡ã®ãšã©ãŒãè¿ããŸãã
{"error":{"message":"Profile not found"}}
çµç¹ãã©ããŒã¯ãããã£ãŒã«ãšå¯Ÿè±¡çµç¹ã®äž¡æ¹ãååšããããšã確èªããŸãã
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error":{"message":"Organization is already being followed"}}
ãããã£ãŒã«ãèŠã€ãããªãçµç¹ãã©ããŒã§ã¯æ¬¡ã®ãšã©ãŒã«ãªããŸãã
{"error":{"message":"Profile not found"}}
çµç¹ãèŠã€ãããªãçµç¹ãã©ããŒã§ã¯æ¬¡ã®ãšã©ãŒã«ãªããŸãã
{"error":{"message":"Organization not found"}}
çµç¹ãã©ããŒè§£é€ã®å¯Ÿè±¡ããªãå Žåã¯æ¬¡ã®ãšã©ãŒã«ãªããŸãã
{"error":{"message":"Organization follow not found"}}
ååãããã¯å¯Ÿè±¡ååãååšããããšã確èªããåãååã®äºéããããé²ããŸãã
{"error":{"message":"Product is already liked"}}
{"error":{"message":"Product not found"}}
{"error":{"message":"Profile not found"}}
ååãããè§£é€ã®å¯Ÿè±¡ããªãå Žåã¯æ¬¡ã®ãšã©ãŒã«ãªããŸãã
{"error":{"message":"Product like not found"}}
ãã©ããŒããã³ãããã®é¢ä¿ã«ã¯ãæäœå ãããã£ãŒã«ã®ææè ãŸãã¯ç®¡çè ã®èªå¯ãå¿ èŠã§ãã
{"error":{"message":"Identity is not authorized to access this resource"}}
ãããã£ãŒã«ã®ååŸãæŽæ°ãåé€ã§ã¯ããªãœãŒã¹ããªãå Žåã«åã Profile not found ãšã©ãŒãè¿ããŸãã
{"error":{"message":"Profile not found"}}
äœæåŠçã§ããŒã¿ããŒã¹æ¿å ¥ã倱æããå Žåã¯æ¬¡ã®ãšã©ãŒãè¿ããŸãã
{"error":{"message":"Failed to create profile"}}
ååŸåŠçã§ããŒã¿ããŒã¹æ¥ç¶ã«å€±æããå Žåã¯æ¬¡ã®ãšã©ãŒãè¿ããŸãã
{"error":{"message":"Failed to get profile"}}
äžèЧåŠçã§ãã£ã«ã¿ãŒãŸãã¯ããŒã¿ããŒã¹æäœã«å€±æããå Žåã¯æ¬¡ã®ãšã©ãŒãè¿ããŸãã
{"error":{"message":"Failed to find profiles"}}
åé€åŠçã§ããŒã¿ããŒã¹æäœã«å€±æããå Žåã¯æ¬¡ã®ãšã©ãŒãè¿ããŸãã
{"error":{"message":"Failed to delete profile"}}
ãããã£ãŒã«ããã©ããŒãããã³ãããã®æ©èœã¯ããŠãŒã¶ãŒæ
å ±ã®è¡šç€ºããœãŒã·ã£ã«é¢ä¿ãçµç¹ã®è³Œèªãååãšã³ã²ãŒãžã¡ã³ãã®åæã«å©çšã§ããŸãã
管çç»é¢ã§ã¯ãããã£ãŒã«ã®äžèЧããã©ãã¯ãŒæ°ãçµç¹ãã©ããŒãååããããçµã¿åãããŠè¡šç€ºã§ããŸãã
ã¯ã©ã€ã¢ã³ãã¯ããŒãžããŒã·ã§ã³ã¡ã¿ããŒã¿ã䜿çšããŠå€§ããªçµæã»ãããæ®µéçã«èªã¿èŸŒããŸãã
ã¢ãã¿ãŒã®æ£èŠåã«ãããã¯ã©ã€ã¢ã³ãã¯ã¹ãã¬ãŒãžãªããžã§ã¯ã ID ã§ã¯ãªãã¢ã¯ã»ã¹å¯èœãª URL ã䜿çšã§ããŸãã
ãããã£ãŒã«æŽæ°åŸã¯ãè¿ããã updatedAt ããã£ãã·ã¥ã®ç¡å¹åã«äœ¿çšã§ããŸãã
ãã©ããŒãŸãã¯ãããã®åé€åŸã¯ãUI äžã®é¢ä¿ç¶æ
ã 204 No Content ã«åºã¥ããŠæŽæ°ããŠãã ããã
| ãã©ããŒæ©èœ | ãã£ãŒã«ã | å | 説æ |
|---|---|---|---|
| ãããã£ãŒã«ãã©ã㌠| profileId | string | ãã©ããŒæäœãè¡ããããã£ãŒã« ID |
| ãããã£ãŒã«ãã©ã㌠| followProfileId | string | ãã©ããŒå ãããã£ãŒã« ID |
| ãããã£ãŒã«ãã©ã㌠| ãªã¯ãšã¹ããã㣠| ãªã | æ¬æã¯äžèŠ |
| ãããã£ãŒã«ãã©ã㌠| æåã¹ããŒã¿ã¹ | HTTP | 204 No Content |
| ãããã£ãŒã«ãã©ã㌠| éè€ãšã©ãŒ | HTTP | 409 Conflict |
| ãããã£ãŒã«ãã©ã㌠| ååšç¢ºèª | boolean | äž¡æ¹ã®ãããã£ãŒã«ãå¿ èŠ |
| ãã©ãã¯ãŒäžèЧ | profileId | string | ãã©ãã¯ãŒãååŸãããããã£ãŒã« ID |
| ãã©ãã¯ãŒäžèЧ | data | array | ãã©ãã¯ãŒãããã£ãŒã«ã®é å |
| ãã©ãã¯ãŒäžèЧ | data[].id | string | ãã©ãã¯ãŒ ID |
| ãã©ãã¯ãŒäžèЧ | data[].name | string | ãã©ãã¯ãŒè¡šç€ºå |
| ãã©ãã¯ãŒäžèЧ | data[].avatar.url | string | ã¢ãã¿ãŒ URL |
| ãã©ãã¯ãŒäžèЧ | data[].avatar.type | string | ã¢ãã¿ãŒ MIME ã¿ã€ã |
| çµç¹ãã©ã㌠| profileId | string | æäœå ãããã£ãŒã« ID |
| çµç¹ãã©ã㌠| followOrganizationId | string | ãã©ããŒå çµç¹ ID |
| çµç¹ãã©ã㌠| ãªã¯ãšã¹ããã㣠| ãªã | æ¬æã¯äžèŠ |
| çµç¹ãã©ã㌠| æåã¹ããŒã¿ã¹ | HTTP | 204 No Content |
| çµç¹ãã©ã㌠| éè€ãšã©ãŒ | HTTP | 409 Conflict |
| çµç¹ãã©ã㌠| ååšç¢ºèª | boolean | ãããã£ãŒã«ãšçµç¹ãå¿ èŠ |
| ååããã | profileId | string | æäœå ãããã£ãŒã« ID |
| ååããã | likeProductId | string | ããããä»ããåå ID |
| ååããã | ãªã¯ãšã¹ããã㣠| ãªã | æ¬æã¯äžèŠ |
| ååããã | æåã¹ããŒã¿ã¹ | HTTP | 204 No Content |
| ååããã | éè€ãšã©ãŒ | HTTP | 409 Conflict |
| ããŒãžããŒã·ã§ã³ | page | number | ååŸããããŒãžçªå· |
| ããŒãžããŒã·ã§ã³ | limit | number | 1ããŒãžãããã®çµææ° |
| ããŒãžããŒã·ã§ã³ | hasNext | boolean | 次ããŒãžã®æç¡ |
| ããŒãžããŒã·ã§ã³ | hasPrev | boolean | åããŒãžã®æç¡ |
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error":{"message":"Profile is already being followed"}}
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error":{"message":"Organization is already being followed"}}
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error":{"message":"Product is already liked"}}
ãšã³ããã€ã³ãããšã®åäœãšæ€èšŒ:
- ãããã£ãŒã«äœæã¯ JSON ãªã¯ãšã¹ãããã£ãåãåããŸãã
- ãããã£ãŒã«äœæã§ã¯
Content-Type: application/jsonãæå®ããŸãã - ãããã£ãŒã«äœæã§ã¯èªèšŒæžã¿ãªã¯ãšã¹ããå¿ èŠã§ãã
- ãããã£ãŒã«äœæã¯ç®¡çè ãŸãã¯å¯Ÿè±¡ã¢ã€ãã³ãã£ãã£æ¬äººã«èš±å¯ãããŸãã
- ãããã£ãŒã«äœæã®æåæã«ãã©ããŒé åã¯ç©ºã§åæåãããŸãã
- ãããã£ãŒã«äœæã®æåæã«ãããé åã¯ç©ºã§åæåãããŸãã
- ãããã£ãŒã«äœæã®å€±ææã«å¿
é é
ç®ã®æ€èšŒè©³çްã
dataã«å ¥ããŸãã - ãããã£ãŒã«äœæã§ã¯ååšããªãä»»æãã£ãŒã«ããéä¿¡ã§ããŸããã
- ãããã£ãŒã«ååŸã§ã¯
profileIdããã¹ã§æå®ããŸãã - ãããã£ãŒã«ååŸã¯ç®¡çè ãŸãã¯ãããã£ãŒã«ææè ã«éå®ãããŸãã
- ãããã£ãŒã«ååŸã¯ã¢ãã¿ãŒããªãå Žåã«
nullãè¿ããŸãã - ãããã£ãŒã«ååŸã¯äœææ¥æãšæŽæ°æ¥æãè¿ããŸãã
- ãããã£ãŒã«ååŸã®èªå¯å€å®ã«ã¯é¢é£ããã¢ã€ãã³ãã£ãã£ã䜿çšããŸãã
- ãããã£ãŒã«äžèЧã¯ç®¡çè å°çšã®èªã¿åãæäœã§ãã
- ãããã£ãŒã«äžèЧã¯è¡šç€ºåã«ãããã£ã«ã¿ãŒãåãåããŸãã
- ãããã£ãŒã«äžèŠ§ã¯ identity ID ã«ãããã£ã«ã¿ãŒãåãåããŸãã
- ãããã£ãŒã«äžèЧã¯ãã£ã«ã¿ãŒãçç¥ãããšç®¡çå¯èœãªãããã£ãŒã«ãè¿ããŸãã
- ãããã£ãŒã«äžèЧã®
pageã¯æŽæ°ã§ãã - ãããã£ãŒã«äžèЧã®
limitã¯æŽæ°ã§ãã - ãããã£ãŒã«äžèЧã§ã¯ããŒãžãšä»¶æ°ã®æå°å€ããã³æå€§å€ãæ€èšŒããŸãã
- ãããã£ãŒã«äžèЧã®åèŠçŽ ã¯ãããã£ãŒã«ã®å®å šãªé¢ä¿é åãè¿ããŸãã
- ãããã£ãŒã«äžèЧã§ã¯ã¢ãã¿ãŒã URL ã«æ£èŠåã§ããŸãã
- ãããã£ãŒã«äžèЧã®äžæ£ãªãã£ã«ã¿ãŒã¯ãšã©ãŒã«ãªããŸãã
- ãããã£ãŒã«æŽæ°ã¯éšåæŽæ°ã§ãã
- ãããã£ãŒã«æŽæ°ã§ã¯è¡šç€ºåã ãã倿Žã§ããŸãã
- ãããã£ãŒã«æŽæ°ã§ã¯ã¢ãã¿ãŒã ãã倿Žã§ããŸãã
- ãããã£ãŒã«æŽæ°ã§ã¯è¡šç€ºåãšã¢ãã¿ãŒãåæã«å€æŽã§ããŸãã
- ãããã£ãŒã«æŽæ°ã§ã¯ identity ID ã倿Žã§ããŸããã
- ãããã£ãŒã«æŽæ°ã§ã¯ãã©ããŒé åãçŽæ¥å€æŽã§ããŸããã
- ãããã£ãŒã«æŽæ°ã§ã¯ååãããé åãçŽæ¥å€æŽã§ããŸããã
- ãããã£ãŒã«æŽæ°ã§ã¯ç©ºã®ãªããžã§ã¯ããéä¿¡ããŸããã
- ãããã£ãŒã«æŽæ°ã®ç¡å€æŽç¶æ ã¯æåãšããŠæ±ãããŸããã
- ãããã£ãŒã«åé€ã¯æ°žç¶çã«ãããã£ãŒã«ãåé€ããŸãã
- ãããã£ãŒã«åé€ã¯ã¬ã¹ãã³ã¹ããã£ãè¿ããŸããã
- ãããã£ãŒã«åé€ã§ã¯å¯Ÿè±¡ãããã£ãŒã«ã®ææè 確èªãè¡ããŸãã
- ã¢ãã¿ãŒã¢ããããŒã URL ã¯ãã¡ã€ã«ãçŽæ¥ã¢ããããŒãããããã«äœ¿çšããŸãã
- ã¢ãã¿ãŒã¢ããããŒã URL ã¯äžæç㪠URL ã§ãã
- ã¢ãã¿ãŒã¢ããããŒã URL ã® MIME ã¿ã€ãã¯ç»åã«å¶éãããŸãã
- ã¢ãã¿ãŒã¢ããããŒã URL ã®ãµã€ãºäžé㯠10,000,000 ãã€ãã§ãã
- ã¢ãã¿ãŒã¢ããããŒã URL ã䜿ãåã«
fileStorageDriverãèšå®ããŸãã - ã¢ãã¿ãŒã®ã¢ããããŒãåŸã«è¿ããããªããžã§ã¯ã ID ããããã£ãŒã«æŽæ°ã«æå®ã§ããŸãã
- identity å¥ãããã£ãŒã«æ€çŽ¢ã¯èªå·±ã¢ã¯ã»ã¹ã ããèš±å¯ããŸãã
- identity å¥ãããã£ãŒã«æ€çŽ¢ã§ã¯ä»äººã® identity ID ã䜿çšã§ããŸããã
- identity å¥ãããã£ãŒã«æ€çŽ¢ã¯ã¢ãã¿ãŒ URL ãæ£èŠåããŸãã
- identity å¥ãããã£ãŒã«æ€çŽ¢ã¯ããŒãžããŒã·ã§ã³ã¡ã¿ããŒã¿ãè¿ããŸãã
- ãããã£ãŒã«ãã©ããŒã§ã¯ãã©ããŒå ãšãã©ããŒå ã® ID ãå¿ èŠã§ãã
- ãããã£ãŒã«ãã©ããŒã§ã¯èªåèªèº«ãæ±ãã¢ããªã±ãŒã·ã§ã³åŽã®ã«ãŒã«ãèæ ®ããŠãã ããã
- ãããã£ãŒã«ãã©ããŒã¯æ¢åé¢ä¿ãéè€äœæããŸããã
- ãããã£ãŒã«ãã©ããŒã®äœæã¯ããŒã¿ããŒã¹ã«é¢ä¿ãä¿åããŸãã
- ãããã£ãŒã«ãã©ããŒè§£é€ã¯ããŒã¿ããŒã¹ããé¢ä¿ãåé€ããŸãã
- ãã©ããŒè§£é€ã§ã¯ååšããªãé¢ä¿ãåé€ã§ããŸããã
- ãã©ãã¯ãŒäžèЧã¯ãã©ããŒå ãããã£ãŒã«ã®ãã©ãã¯ãŒãè¿ããŸãã
- ãã©ãã¯ãŒäžèЧã¯å€§èŠæš¡ãªãã©ãã¯ãŒæ°ã«å¯Ÿå¿ããããŒãžããŒã·ã§ã³ãæäŸããŸãã
- ãã©ãã¯ãŒäžèЧã¯åãã©ãã¯ãŒã®è¡šç€ºåãè¿ããŸãã
- ãã©ãã¯ãŒäžèЧã¯å©çšå¯èœãªå Žåã«ã¢ãã¿ãŒãè¿ããŸãã
- çµç¹ãã©ããŒã§ã¯çµç¹ ID ããã¹ã§æå®ããŸãã
- çµç¹ãã©ããŒã¯å¯Ÿè±¡çµç¹ã®ååšãæ€èšŒããŸãã
- çµç¹ãã©ããŒã¯æ¢åã®çµç¹ãã©ããŒãéè€äœæããŸããã
- çµç¹ãã©ããŒè§£é€ã¯ãããã£ãŒã«ãšçµç¹ã®é¢ä¿ãåé€ããŸãã
- çµç¹ãã©ããŒè§£é€ã¯ååšããªãé¢ä¿ã«å¯ŸããŠå€±æããŸãã
- ååãããã§ã¯åå ID ããã¹ã§æå®ããŸãã
- ååãããã¯å¯Ÿè±¡ååã®ååšãæ€èšŒããŸãã
- ååãããã¯æ¢åã®ããããéè€äœæããŸããã
- ååãããè§£é€ã¯ãããã£ãŒã«ãšååã®é¢ä¿ãåé€ããŸãã
- ååãããè§£é€ã¯ååšããªãé¢ä¿ã«å¯ŸããŠå€±æããŸãã
- ãã¹ãŠã®ãã©ããŒæäœã¯ç©ºã®ãªã¯ãšã¹ãããã£ã䜿çšããŸãã
- ãã¹ãŠã®ååãããæäœã¯ç©ºã®ãªã¯ãšã¹ãããã£ã䜿çšããŸãã
- ãã©ããŒãšãããã®æåæã¯
204ã確èªããŸãã 204ã®å¿çæ¬æã JSON ãšããŠè§£æããªãã§ãã ããã- èªèšŒå€±æã§ã¯æå¹ãªã¢ã¯ã»ã¹ããŒã¯ã³ãåååŸããŠãã ããã
- æš©éäžè¶³ã§ã¯å¥ã®ãŠãŒã¶ãŒã®ãããã£ãŒã«ã倿Žããªãã§ãã ããã
404ã§ã¯ã¯ã©ã€ã¢ã³ã衚瀺ãååšããªãç¶æ ã«æŽæ°ããŠãã ããã409ã§ã¯éè€é¢ä¿ãæåãšããŠè¡šç€ºããªãã§ãã ããã500ã§ã¯äžæçãªé害ãšããŠåè©Šè¡æ¹éãæ€èšããŠãã ããã- Cookie èªèšŒã§ã¯ã¯ãã¹ãªãªãžã³èšå®ã確èªããŠãã ããã
- Bearer èªèšŒã§ã¯
AuthorizationããããŒãæ¯åéä¿¡ããŸãã - ãã£ã³ã¬ãŒããªã³ãèªèšŒã§ã¯åãããã€ã¹ãã£ã³ã¬ãŒããªã³ããéä¿¡ããŸãã
- ã¡ãŒã«ã¢ãã¬ã¹ãªã©ã®ã¢ã€ãã³ãã£ãã£è©³çްã¯ãããã£ãŒã« API ã®ã¬ã¹ãã³ã¹ã«å«ãŸããŸããã
- ãããã£ãŒã« API ã¯ã¢ã€ãã³ãã£ã㣠API ã®ä»£ããã§ã¯ãããŸããã
- çµç¹ãã©ããŒã®ååšç¢ºèªã«ã¯çµç¹ãµãŒãã¹ã®ããŒã¿ã䜿ããŸãã
- ååãããã®ååšç¢ºèªã«ã¯ååãµãŒãã¹ã®ããŒã¿ã䜿ããŸãã
- ã¢ãã¿ãŒ URL ã®çœ²åã¯ã¹ãã¬ãŒãžãã©ã€ããŒã®å®è£ ã«äŸåããŸãã
- ã¢ãã¿ãŒãåé€ããå Žåã¯æŽæ°ãªã¯ãšã¹ãã§
avatar: nullã䜿çšããŸãã - ã¢ãã¿ãŒã® object ID ã¯ã¯ã©ã€ã¢ã³ãã§ç§å¯æ å ±ãšããŠæ±ãå¿ èŠã¯ãããŸããã
- ãã ã眲åä»ã URL ã¯å ¬éæéãæèããŠæ±ã£ãŠãã ããã
- ãããã£ãŒã«è¡šç€ºåã®æ€çŽ¢ã¯ã¢ããªã±ãŒã·ã§ã³ã®ãã£ã«ã¿ãŒä»æ§ã«åŸããŸãã
- ããŒãžããŒã·ã§ã³ã䜿çšããªãäžèЧã§ãã¡ã¿ããŒã¿ãè¿ããŸãã
- ã¯ã©ã€ã¢ã³ãã¯
totalPagesã䜿çšããŠããŒãžããã²ãŒã·ã§ã³ãäœæã§ããŸãã - ã¯ã©ã€ã¢ã³ãã¯
hasPrevã䜿çšããŠåãžç§»åããå¶åŸ¡ã衚瀺ã§ããŸãã - ã¯ã©ã€ã¢ã³ãã¯
hasNextã䜿çšããŠæ¬¡ãžç§»åããå¶åŸ¡ã衚瀺ã§ããŸãã - ãã©ãã¯ãŒæ°ã¯ããŒãžããŒã·ã§ã³ã®
totalããååŸã§ããŸãã - ãããã£ãŒã«äžèЧã®ç·æ°ã¯ããŒãžããŒã·ã§ã³ã®
totalããååŸã§ããŸãã - identity 奿€çŽ¢ã®ç·æ°ã¯ããŒãžããŒã·ã§ã³ã®
totalããååŸã§ããŸãã - ãããã£ãŒã«ã®é¢ä¿ç¶æ ã倿Žããåã«èªå¯ã確èªããŠãã ããã
- ããã³ããšã³ãã§ã¯æ¥œèŠ³çæŽæ°åŸã API ãšã©ãŒãåŠçããŠãã ããã
- API ãã¹ãJSON ããŒããµãŒããŒãšã©ãŒæååã¯å€æŽããªãã§ãã ããã
å®è£ ããã³å©çšã¬ã€ã:
- ãããã£ãŒã«ãµãŒãã¹ã¯ CRUD æäœãæäŸããŸãã
- ãããã£ãŒã«ãµãŒãã¹ã¯ MongoDB ãšçµ±åããŸãã
- ãããã£ãŒã«ãµãŒãã¹ã¯ Nodeblocks ã®é¢æ°ååæã䜿çšããŸãã
- ãããã£ãŒã«ãµãŒãã¹ã¯èªèšŒãµãŒãã¹ãšäœµçšã§ããŸãã
- ãããã£ãŒã«ãµãŒãã¹ã¯çµç¹ãµãŒãã¹ãšäœµçšã§ããŸãã
- ãããã£ãŒã«ãµãŒãã¹ã¯ååãµãŒãã¹ãšäœµçšã§ããŸãã
- ãããã£ãŒã«ãµãŒãã¹ã¯ãœãŒã·ã£ã«æ©èœã®åºç€ã«ãªããŸãã
- ãããã£ãŒã«äœæåã«ã¢ã€ãã³ãã£ãã£ãäœæããŸãã
- ãããã£ãŒã«äœæåŸã« API ããè¿ã ID ãä¿åããŸãã
- ãããã£ãŒã« ID ã¯ã¢ã€ãã³ãã£ã㣠ID ãšç°ãªããŸãã
- identity ID ã¯ãããã£ãŒã«ã®ææè ã衚ããŸãã
- 衚瀺åã¯ãããã£ãŒã«ç»é¢ã«äœ¿çšã§ããŸãã
- ã¢ãã¿ãŒã¯ãããã£ãŒã«ç»é¢ã«äœ¿çšã§ããŸãã
- ã¢ãã¿ãŒããªããŠãŒã¶ãŒã«ã¯æ¢å®ã® UI ã衚瀺ã§ããŸãã
- èªåçæ ID ã¯ã¯ã©ã€ã¢ã³ãã§æå®ããŸããã
- èªåçææ¥æã¯ã¯ã©ã€ã¢ã³ãã§æå®ããŸããã
- ãã©ããŒé åã¯ãµãŒãã¹ã管çããŸãã
- çµç¹ãã©ããŒé åã¯ãµãŒãã¹ã管çããŸãã
- ååãããé åã¯ãµãŒãã¹ã管çããŸãã
- äœææã«ã¯ãããã®é¢ä¿é åãéä¿¡ããŸããã
- æŽæ°æã«ããããã®é¢ä¿é åãéä¿¡ããŸããã
- é¢ä¿ã®äœæã«ã¯å°çšã®ãšã³ããã€ã³ãã䜿ããŸãã
- é¢ä¿ã®åé€ã«ã¯å°çšã®ãšã³ããã€ã³ãã䜿ããŸãã
- ãããã£ãŒã«ã®ååŸã«ã¯æ£ç¢ºãªãããã£ãŒã« ID ã䜿ããŸãã
- ãããã£ãŒã«ååŸã®çµæã¯ãããã£ãŒã«è©³çްç»é¢ã«äœ¿ããŸãã
- ãããã£ãŒã«äžèЧã®çµæã¯ç®¡çè ç»é¢ã«äœ¿ããŸãã
- identity 奿€çŽ¢ã®çµæã¯æ¬äººã®ãããã£ãŒã«éžæã«äœ¿ããŸãã
- 衚瀺åãã£ã«ã¿ãŒã¯æ€çŽ¢ UI ã«äœ¿ããŸãã
- identity ID ãã£ã«ã¿ãŒã¯éçšèª¿æ»ã«äœ¿ããŸãã
- ããŒãžçªå·ã¯ 1 ããå§ãŸããŸãã
- ããŒãžãµã€ãºã¯å©çšè ã®ç»é¢ãµã€ãºã«åãããŸãã
- ããŒãžãµã€ãºã倧ããããå Žåã¯å¿çãå¢å€§ããŸãã
- ããŒãžãµã€ãºãå°ããããå Žåã¯ãªã¯ãšã¹ãåæ°ãå¢ããŸãã
metadata.paginationã¯äžèЧå¿çã«å«ãŸããŸããpageã¯çŸåšè¡šç€ºããŠããããŒãžã瀺ããŸããlimitã¯èŠæ±ããããŒãžãµã€ãºã瀺ããŸããtotalã¯æ€çŽ¢çµæã®ä»¶æ°ã瀺ããŸããtotalPagesã¯å©çšå¯èœãªããŒãžæ°ã瀺ããŸããhasNextã¯ç¶ããèªã¿èŸŒããã瀺ããŸããhasPrevã¯åã®ããŒãžãããã瀺ããŸãã- ã¢ãã¿ãŒãååšããå Žå㯠URL ã䜿çšããŠç»åã衚瀺ããŸãã
- ã¢ãã¿ãŒã® URL ã¯ã¹ãã¬ãŒãžã¢ã¯ã»ã¹çšã§ãã
- ã¢ãã¿ãŒ URL ã® MIME ã¿ã€ããç»åèŠçŽ ã®åŠçã«äœ¿ããŸãã
- ã¢ãã¿ãŒ URL ãé·æãã£ãã·ã¥ããªãã§ãã ããã
- ã¢ãã¿ãŒ URL ã®æå¹æéåãæã¯æ°ãã URL ãååŸããŸãã
- ã¢ãã¿ãŒ URL ã®ååŸã¯ã¢ããããŒãåã®æé ã§ãã
- ã¢ãã¿ãŒæ¬äœã¯çœ²åä»ã URL ãžã¢ããããŒãããŸãã
- ã¢ããããŒãæååŸã« object ID ãä¿åããŸãã
- ä¿åãã object ID ãã¢ãã¿ãŒæŽæ°ã«äœ¿ããŸãã
- ã¢ãã¿ãŒãå€ãå Žå㯠null ã䜿ããŸãã
- null ã®ã¢ãã¿ãŒã¯ãšã©ãŒã§ã¯ãããŸããã
- ã¢ãã¿ãŒã®æŽæ°ã¯ãããã£ãŒã«ææè ãå®è¡ã§ããŸãã
- ã¢ãã¿ãŒã®æŽæ°ã¯ç®¡çè ãå®è¡ã§ããŸãã
- ãããã£ãŒã«åã®æŽæ°ã¯ãããã£ãŒã«ææè ãå®è¡ã§ããŸãã
- ãããã£ãŒã«åã®æŽæ°ã¯ç®¡çè ãå®è¡ã§ããŸãã
- ä»äººã®ãããã£ãŒã«ãéåžžãŠãŒã¶ãŒãæŽæ°ã§ããŸããã
- ä»äººã®ãããã£ãŒã«ãéåžžãŠãŒã¶ãŒãåé€ã§ããŸããã
- èªã¿åããææè ãŸãã¯ç®¡çè ã«å¶éãããŸãã
- 管çè ã®å€å®ã«ã¯ identity ã®çš®å¥ã䜿ããŸãã
- ææè ã®å€å®ã«ã¯ identity ID ã䜿ããŸãã
- èªå¯åã«èªèšŒãå¿ èŠã§ãã
- æªèªèšŒã®å Žåã¯ãªã¯ãšã¹ããä¿è·ããŸããã
- ç¡å¹ãªããŒã¯ã³ã¯èªèšŒå€±æã«ãªããŸãã
- æå¹æéåãã®ããŒã¯ã³ã¯æŽæ°ãŸãã¯åãã°ã€ã³ãå¿ èŠã§ãã
- Cookie ã¢ãŒãã§ã¯ãã©ãŠã¶ãŒã Cookie ãéä¿¡ããŸãã
- Bearer ã¢ãŒãã§ã¯ã¯ã©ã€ã¢ã³ããããããŒãéä¿¡ããŸãã
- CORS ã䜿ãå Žå㯠Cookie èšå®ã確èªããŸãã
- Cookie ã®ã»ãã¥ãªãã£å±æ§ãæ¬çªç°å¢ã§ç¢ºèªããŸãã
- ãã£ã³ã¬ãŒããªã³ãã䜿ãå Žåã¯åãããã€ã¹æ å ±ãéä¿¡ããŸãã
- ãã£ã³ã¬ãŒããªã³ããäžèŠãªèªå¯ã§ã¯ãã®ããããŒãçç¥ã§ããŸãã
- ãã£ã³ã¬ãŒããªã³ãã®å€ã¯ API ã®ä»æ§ã«åŸã£ãŠçæããŸãã
- ãããã£ãŒã«ãã©ããŒã¯äžæ¹åã®é¢ä¿ã§ãã
- ãã©ããŒå ããã©ããŒå ãèªåçã«ãã©ããŒããããšã¯ãããŸããã
- ãã©ããŒé¢ä¿ã¯ãã©ãã¯ãŒäžèЧã«åæ ãããŸãã
- ãã©ããŒé¢ä¿ã¯ãããã£ãŒã«ã®ãœãŒã·ã£ã«è¡šç€ºã«äœ¿çšã§ããŸãã
- éè€ãã©ããŒã¯ã¯ã©ã€ã¢ã³ãåŽã§ã鲿¢ã§ããŸãã
- ãµãŒããŒåŽã®ç«¶åå¿çãå¿ ãåŠçããŸãã
- ãã©ããŒãè§£é€ããåŸã¯ãã©ãã¯ãŒäžèЧãåèªã¿èŸŒã¿ã§ããŸãã
- ãã©ãã¯ãŒäžèЧã¯ããŒãžããŒã·ã§ã³ã䜿çšããŸãã
- ãã©ãã¯ãŒäžèЧã¯ã¢ãã¿ãŒãæããªããŠãŒã¶ãŒãè¿ããŸãã
- ãã©ãã¯ãŒäžèЧã§ã¢ãã¿ãŒããªãå Žåã¯æ¢å®ç»åã衚瀺ã§ããŸãã
- çµç¹ãã©ããŒã¯çµç¹ã®è³Œèªæ©èœã«äœ¿ããŸãã
- çµç¹ãã©ããŒã¯çµç¹ã®æŽæ°éç¥æ©èœã«äœ¿ããŸãã
- çµç¹ãã©ããŒã¯çµç¹ã®ãã©ãã¯ãŒåæã«äœ¿ããŸãã
- çµç¹ãã©ããŒãäœãåã«çµç¹ ID ã確èªããŸãã
- çµç¹ãã©ããŒãè§£é€ããåã«é¢ä¿ã®ç¶æ ã確èªã§ããŸãã
- ååãããã¯ååãžã®é¢å¿ã衚ããŸãã
- ååãããã¯åå人æ°ã®åæã«äœ¿ããŸãã
- ååãããã¯ããããæ©èœã«äœ¿ããŸãã
- ååããããäœãåã«åå ID ã確èªããŸãã
- ååããããè§£é€ããåã«é¢ä¿ã®ç¶æ ã確èªã§ããŸãã
- åãååãžã®ããã㯠1 ã€ã ãååšããŸãã
- åãçµç¹ãžã®ãã©ããŒã¯ 1 ã€ã ãååšããŸãã
- åããããã£ãŒã«ãžã®ãã©ããŒã¯ 1 ã€ã ãååšããŸãã
- é¢ä¿ API ã¯ç©ºã®æ¬æã§åŒã³åºããŸãã
- ç©ºã®æ¬æã¯ JSON ã®ç©ºãªããžã§ã¯ããšã¯ç°ãªããŸãã
- é¢ä¿ API ã®æåæã¯ HTTP ã¹ããŒã¿ã¹ã ãã確èªããŸãã
- æååŸã«é¢ä¿é åã® UI ãæŽæ°ããŸãã
- 倱æåŸã«æ¥œèŠ³çæŽæ°ãããŒã«ããã¯ããŸãã
400ã¯ãªã¯ãšã¹ã圢åŒã®åé¡ã瀺ããŸãã401ã¯èªèšŒç¶æ ã®åé¡ã瀺ããŸãã403ã¯ã¢ã¯ã»ã¹æš©ã®åé¡ã瀺ããŸãã404ã¯å¯Ÿè±¡ãªãœãŒã¹ã®åé¡ã瀺ããŸãã409ã¯é¢ä¿ã®éè€ãŸãã¯ç«¶åã瀺ããŸãã500ã¯ãµãŒããŒåŽãŸãã¯ããŒã¿ã¹ãã¢åŽã®åé¡ã瀺ããŸããValidation Errorã®dataã¯ä¿®æ£ãã¹ãé ç®ã瀺ããŸãã- ãšã©ãŒã®
messageã¯è¡šç€ºçšã«ç¿»èš³ããæè¡å€ãšããŠæ±ããŸãã - ã¯ã©ã€ã¢ã³ãåã衚瀺ã¯ã¢ããªã±ãŒã·ã§ã³åŽã§é©åã«äœæããŸãã
- ãµãŒããŒè¿åŽã® HTTP ã¹ããŒã¿ã¹ã¯å€æŽããŸããã
- ãªã¯ãšã¹ãã® JSON ããŒã¯å€æŽããŸããã
- API ãã¹ã®åæ°åœ¢ãšè€æ°åœ¢ã倿ŽããŸããã
- URL ãã©ã¡ãŒã¿åã倿ŽããŸããã
- èšå®å€ã¯ç°å¢å€æ°ã§ç®¡çã§ããŸãã
authSecretsã¯ãœãŒã¹ã³ãŒãã«çŽæ¥å ¬éããŸããã- æ¬çªç°å¢ã§ã¯åŒ·ã JWT ã·ãŒã¯ã¬ããã䜿çšããŸãã
- MongoDB ã³ã¬ã¯ã·ã§ã³ã®ååã¯ãµãŒãã¹èšå®ãšäžèŽãããŸãã
profilesã³ã¬ã¯ã·ã§ã³ã¯ãããã£ãŒã«ãä¿åããŸããidentitiesã³ã¬ã¯ã·ã§ã³ã¯ã¢ã€ãã³ãã£ãã£ãä¿åããŸããorganizationsã³ã¬ã¯ã·ã§ã³ã¯çµç¹ãä¿åããŸããproductsã³ã¬ã¯ã·ã§ã³ã¯ååãä¿åããŸãã- ãµãŒãã¹èµ·åæã«å¿ èŠãªããŒã¿ã¹ãã¢ãæž¡ããŸãã
- ã¢ãã¿ãŒæ©èœã䜿ãå Žåã«ãã¡ã€ã«ã¹ãã¬ãŒãžãã©ã€ããŒãæž¡ããŸãã
- ã¹ãã¬ãŒãžãã©ã€ããŒã®å€±æã¯ãšã©ãŒãšããŠåŠçããŸãã
- ããŒã¿ããŒã¹æ¥ç¶ã®å€±æã¯ãšã©ãŒãšããŠåŠçããŸãã
- 倱æããæžã蟌ã¿ãç¡æ¡ä»¶ã«å詊è¡ããŸããã
- æžã蟌ã¿ã®å詊è¡ã§ã¯éè€é¢ä¿ã«æ³šæããŸãã
- èªã¿åãã®å詊è¡ã§ã¯èªèšŒç¶æ ã確èªããŸãã
- ãŠãŒã¶ãŒãå逿žã¿ãããã£ãŒã«ãéããå Žåã¯äžèŠ§ãžæ»ããŸãã
- 管çè ã¯ãããã£ãŒã«äžèЧãã詳现ç»é¢ãžé·ç§»ã§ããŸãã
- ææè ã¯èªåã®ãããã£ãŒã«ãç·šéã§ããŸãã
- ææè ã¯èªåã®ãããã£ãŒã«ãåé€ã§ããŸãã
- ãããã£ãŒã« API ã¯ãŠãŒã¶ãŒã®ãã¹ã¯ãŒããè¿ããŸããã
- ãããã£ãŒã« API ã¯èªèšŒããŒã¯ã³ãè¿ããŸããã
- èªèšŒããŒã¯ã³ã¯èªèšŒãµãŒãã¹ã§ååŸããŸãã
- çµç¹æ å ±ã®è©³çްã¯çµç¹ãµãŒãã¹ã§ååŸããŸãã
- ååæ å ±ã®è©³çްã¯ååãµãŒãã¹ã§ååŸããŸãã
- ãããã£ãŒã«å¿çã®é¢ä¿é åã¯ã¢ããªã®ç¶æ 衚瀺ã«äœ¿ããŸãã
- 倧éã®ãããã£ãŒã«ã§ã¯äžèЧ API ã®ããŒãžããŒã·ã§ã³ãåžžã«äœ¿ããŸãã
- 倧éã®ãã©ãã¯ãŒã§ã¯ãã©ãã¯ãŒ API ã®ããŒãžããŒã·ã§ã³ãåžžã«äœ¿ããŸãã
- ã¢ãã¿ãŒã®ç»å圢åŒã¯ã¯ã©ã€ã¢ã³ã察å¿ç¶æ³ãèæ ®ããŸãã
- HEIC ã HEIF ã䜿ãå Žåã¯ãã©ãŠã¶ãŒå¯Ÿå¿ã確èªããŸãã
- SVG ã衚瀺ããå Žåã¯ã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£æ¹éã確èªããŸãã
- ã¢ããããŒããããã¡ã€ã«ãµã€ãºãã¯ã©ã€ã¢ã³ãåŽã§ã確èªã§ããŸãã
- API åŽã®ãµã€ãºæ€èšŒãã¯ã©ã€ã¢ã³ãåŽæ€èšŒã®ä»£ããã«ããŸããã
- API åŽã®èªå¯ãã¯ã©ã€ã¢ã³ãåŽã®è¡šç€ºå¶åŸ¡ã®ä»£ããã«ããŸããã
- ãã¹ãŠã®ä¿è·æäœã¯ãµãŒããŒåŽã®èªå¯å€å®ãéããŸãã
- ãããã£ãŒã« API ã®æ£åžžç³»ãšç°åžžç³»ãã¯ã©ã€ã¢ã³ãå®è£ ã§ãã¹ãããŠãã ããã
- äœæãååŸãäžèŠ§ãæŽæ°ãåé€ã®ãã¹ãŠã®ãããŒã確èªããŠãã ããã
- ã¢ãã¿ãŒã®ã¢ããããŒã URL ãšãããã£ãŒã«æŽæ°ã®é£æºã確èªããŠãã ããã
- identity 奿€çŽ¢ã§æ¬äººä»¥å€ã®ã¢ã¯ã»ã¹ãæåŠãããããšã確èªããŠãã ããã
- ãã©ããŒããã©ããŒè§£é€ããã©ãã¯ãŒäžèЧã®åãããŒã確èªããŠãã ããã
- çµç¹ãã©ããŒãšååãããã®åãããŒã確èªããŠãã ããã
- éè€é¢ä¿ãç«¶åãšããŠè¿ãããããšã確èªããŠãã ããã
- ããŒãžããŒã·ã§ã³ã®å é ãéäžãæåŸã®ããŒãžã確èªããŠãã ããã
- Cookie ã¢ãŒããš bearer ã¢ãŒãã®äž¡æ¹ã䜿çšããå Žåã¯ããããã確èªããŠãã ããã
- ãã¡ã€ã«ã¹ãã¬ãŒãžãèšå®ããç°å¢ã§ã¢ãã¿ãŒ URL ã®æéåãã確èªããŠãã ããã
ðïž ããŒã¿ã¹ãã¢â
| ã³ã¬ã¯ã·ã§ã³ | å¿ é | çšé |
|---|---|---|
profiles | â | ãããã£ãŒã«ææž |
identities | â | èªèšŒãšææè æ€èšŒ |
organizations | â | çµç¹ãã©ããŒã®æ€èšŒ |
products | â | ååãããã®æ€èšŒ |
âïž èšå®ãªãã·ã§ã³â
ãµãŒãã¹èšå®â
authSecrets ã« JWT ã®æå·åã»çœ²åã·ãŒã¯ã¬ãããæå®ããŸããauthMode 㯠'bearer' ãŸã㯠'cookie'ïŒæªæå®æã¯ãã¢ã©ãŒåäœïŒã§ããidentity.typeIds ã§ã¯ç®¡çè
ãã²ã¹ããéåžžãŠãŒã¶ãŒã®çš®å¥ ID ããçµç¹æäœã«ã¯ organization.roles ãèšå®ã§ããŸãã
èšå®è©³çްâ
ð ã»ãã¥ãªãã£èšå®â
authSecrets ã«ã¯ JWT ã®æå·åããã³çœ²åçšã·ãŒã¯ã¬ãããæå®ããŸãã
ð¥ ãŠãŒã¶ãŒçš®å¥èšå®â
identity.typeIds ã«ã¯ç®¡çè
ãã²ã¹ããéåžžãŠãŒã¶ãŒã®çš®å¥ ID ãæå®ããŸãã
ð¢ çµç¹åœ¹å²èšå®â
çµç¹ãã©ããŒã®æäœã§ã¯ãå¿
èŠã«å¿ã㊠organization.roles ãèšå®ããŸãã
ð èªèšŒã¢ãŒãâ
authMode 㯠'bearer' ãŸã㯠'cookie' ã§ããæå®ããªãå Žå㯠bearer ã¢ãŒãã«ãªããŸãã
èšå®äŸâ
const profileConfig = {
authSecrets: {authEncSecret: 'your-enc-secret', authSignSecret: 'your-sign-secret'},
authMode: 'bearer',
identity: {typeIds: {admin: '100', guest: '000', regular: '001'}},
};
ðš ãšã©ãŒãã³ããªã³ã°â
ãšã©ãŒã¯ {error: {message, data?}} 圢åŒã§è¿ãããŸããäž»ãªç¶æ
ã³ãŒãã¯ãç¡å¹ãªãªã¯ãšã¹ãã® 400ãèªèšŒå€±æã® 401ãæš©éäžè¶³ã® 403ããããã£ãŒã«ãŸãã¯é¢é£ãšã³ãã£ãã£ããªãå Žåã® 404ãç«¶åãããã©ããŒïŒãããæäœãªã©ã® 409ãããŒã¿ã¹ãã¢é害㮠500 ã§ãã
代衚çãªãšã©ãŒã³ãŒãâ
400 ã¯ç¡å¹ãªãªã¯ãšã¹ãã401 ã¯èªèšŒå€±æã403 ã¯æš©éäžè¶³ã404 ã¯èŠã€ãããªããªãœãŒã¹ã409 ã¯ç«¶åã500 ã¯ããŒã¿ã¹ãã¢é害ã衚ããŸãã
ãšã©ãŒã¬ã¹ãã³ã¹åœ¢åŒâ
ãšã©ãŒã¯ {error: {message, data?}} ã® JSON 圢åŒã§è¿ãããŸãã