{
	"info": {
		"_postman_id": "mypage-api-collection",
		"name": "bitForum - MyPage API",
		"description": "bitForum 마이페이지 API 컬렉션\n\n로그인 후 Bearer Token을 설정하여 사용하세요.",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"variable": [
		{
			"key": "baseUrl",
			"value": "https://localhost:4000",
			"type": "string"
		},
		{
			"key": "accessToken",
			"value": "",
			"type": "string"
		},
		{
			"key": "refreshToken",
			"value": "",
			"type": "string"
		}
	],
	"auth": {
		"type": "bearer",
		"bearer": [
			{
				"key": "token",
				"value": "{{accessToken}}",
				"type": "string"
			}
		]
	},
	"item": [
		{
			"name": "🔐 Auth",
			"item": [
				{
					"name": "[POST] 로그인",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var json = pm.response.json();",
									"if (json.success && json.data) {",
									"    pm.collectionVariables.set('accessToken', json.data.accessToken);",
									"    pm.collectionVariables.set('refreshToken', json.data.refreshToken);",
									"    console.log('AccessToken, RefreshToken 저장 완료');",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"auth": {
							"type": "noauth"
						},
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"email\": \"test@bitforum.io\",\n    \"password\": \"password123\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/auth/login",
							"host": ["{{baseUrl}}"],
							"path": ["api", "auth", "login"]
						},
						"description": "로그인 후 accessToken, refreshToken이 자동으로 컬렉션 변수에 저장됩니다."
					},
					"response": []
				},
				{
					"name": "[POST] 로그아웃",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"var json = pm.response.json();",
									"if (json.success) {",
									"    pm.collectionVariables.set('accessToken', '');",
									"    pm.collectionVariables.set('refreshToken', '');",
									"    console.log('토큰 초기화 완료');",
									"}"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"refreshToken\": \"{{refreshToken}}\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/auth/logout",
							"host": ["{{baseUrl}}"],
							"path": ["api", "auth", "logout"]
						},
						"description": "로그아웃. RefreshToken을 서버에서 폐기합니다.\n\n- Bearer 토큰 필요\n- 성공 시 컬렉션 변수의 토큰이 자동 초기화됩니다.\n- 이미 폐기된 토큰이면 그냥 성공 반환"
					},
					"response": []
				}
			]
		},
		{
			"name": "📧 이메일",
			"item": [
				{
					"name": "[POST] 이메일 변경",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"newEmail\": \"newemail@bitforum.io\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/mypage/email",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "email"]
						},
						"description": "이메일 변경 요청. 새 이메일로 인증 메일이 발송됩니다.\n\n- 중복 이메일 불가\n- 현재 이메일과 동일하면 에러\n- 변경 즉시 이메일이 바뀌고, IsEmailVerified가 false로 변경"
					},
					"response": []
				},
				{
					"name": "[GET] 이메일 인증",
					"request": {
						"auth": {
							"type": "noauth"
						},
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/mypage/email/verify?token=YOUR_TOKEN_HERE",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "email", "verify"],
							"query": [
								{
									"key": "token",
									"value": "YOUR_TOKEN_HERE",
									"description": "이메일 인증 토큰 (이메일 변경 시 발송된 링크에 포함)"
								}
							]
						},
						"description": "이메일 인증 토큰으로 이메일 인증 완료.\n\n- 인증 불필요 (Anonymous)\n- 토큰 만료: 24시간\n- 이미 인증된 토큰은 재사용 불가"
					},
					"response": []
				}
			]
		},
		{
			"name": "👤 별명",
			"item": [
				{
					"name": "[POST] 별명 변경",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"name\": \"새별명\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/mypage/name",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "name"]
						},
						"description": "별명 변경.\n\n- 최대 40자\n- 중복 별명 불가\n- 변경 로그 기록됨"
					},
					"response": []
				},
				{
					"name": "[DELETE] 별명 삭제",
					"request": {
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/mypage/name",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "name"]
						},
						"description": "별명 삭제 (null로 초기화).\n\n- 이미 비어있으면 에러\n- 삭제 로그 기록됨"
					},
					"response": []
				}
			]
		},
		{
			"name": "💬 한마디",
			"item": [
				{
					"name": "[POST] 한마디 변경",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"summary\": \"안녕하세요! 비트포럼입니다.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/mypage/summary",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "summary"]
						},
						"description": "한마디(상태 메시지) 변경.\n\n- 최대 50자\n- 변경 로그 기록됨"
					},
					"response": []
				},
				{
					"name": "[DELETE] 한마디 삭제",
					"request": {
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/mypage/summary",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "summary"]
						},
						"description": "한마디 삭제 (null로 초기화).\n\n- 이미 비어있으면 에러\n- 삭제 로그 기록됨"
					},
					"response": []
				}
			]
		},
		{
			"name": "📝 자기소개",
			"item": [
				{
					"name": "[POST] 자기소개 변경",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"intro\": \"비트코인과 블록체인에 관심이 많은 개발자입니다.\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/mypage/intro",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "intro"]
						},
						"description": "자기소개 변경.\n\n- 최대 3000자\n- 변경 로그 기록됨"
					},
					"response": []
				},
				{
					"name": "[DELETE] 자기소개 삭제",
					"request": {
						"method": "DELETE",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/mypage/intro",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "intro"]
						},
						"description": "자기소개 삭제 (null로 초기화).\n\n- 이미 비어있으면 에러\n- 삭제 로그 기록됨"
					},
					"response": []
				}
			]
		},
		{
			"name": "🔔 수신설정",
			"item": [
				{
					"name": "[POST] 수신설정 변경",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"isReceiveSMS\": true,\n    \"isReceiveEmail\": true,\n    \"isReceiveNote\": false\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/mypage/receive-settings",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "receive-settings"]
						},
						"description": "SMS/이메일/쪽지 수신 설정 변경.\n\n- 변경된 항목만 동의 시간이 업데이트됩니다."
					},
					"response": []
				}
			]
		},
		{
			"name": "🔒 보안",
			"item": [
				{
					"name": "[POST] 비밀번호 변경",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"currentPassword\": \"password123\",\n    \"newPassword\": \"newpassword456\",\n    \"confirmPassword\": \"newpassword456\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/mypage/password",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "password"]
						},
						"description": "비밀번호 변경.\n\n- 현재 비밀번호 검증 필수\n- 새 비밀번호 6자 이상\n- newPassword와 confirmPassword 일치 필요"
					},
					"response": []
				},
				{
					"name": "[POST] 회원탈퇴",
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n    \"password\": \"password123\"\n}"
						},
						"url": {
							"raw": "{{baseUrl}}/api/mypage/withdraw",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "withdraw"]
						},
						"description": "회원 탈퇴.\n\n- 비밀번호 검증 필수\n- 모든 RefreshToken 무효화\n- IsWithdraw = true, DeletedAt 설정 (소프트 삭제)"
					},
					"response": []
				},
				{
					"name": "[GET] 로그인 기록",
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/api/mypage/login-logs?page=1&pageSize=20",
							"host": ["{{baseUrl}}"],
							"path": ["api", "mypage", "login-logs"],
							"query": [
								{
									"key": "page",
									"value": "1",
									"description": "페이지 번호 (기본값: 1)"
								},
								{
									"key": "pageSize",
									"value": "20",
									"description": "페이지 크기 (기본값: 20, 최대: 50)"
								}
							]
						},
						"description": "로그인 기록 조회.\n\n- 최신순 정렬\n- 페이지네이션 지원 (page, pageSize)\n- 응답: items[], totalCount, page, pageSize"
					},
					"response": []
				}
			]
		}
	]
}