bitforum-mypage-postman.json 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. {
  2. "info": {
  3. "_postman_id": "mypage-api-collection",
  4. "name": "bitForum - MyPage API",
  5. "description": "bitForum 마이페이지 API 컬렉션\n\n로그인 후 Bearer Token을 설정하여 사용하세요.",
  6. "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  7. },
  8. "variable": [
  9. {
  10. "key": "baseUrl",
  11. "value": "https://localhost:4000",
  12. "type": "string"
  13. },
  14. {
  15. "key": "accessToken",
  16. "value": "",
  17. "type": "string"
  18. },
  19. {
  20. "key": "refreshToken",
  21. "value": "",
  22. "type": "string"
  23. }
  24. ],
  25. "auth": {
  26. "type": "bearer",
  27. "bearer": [
  28. {
  29. "key": "token",
  30. "value": "{{accessToken}}",
  31. "type": "string"
  32. }
  33. ]
  34. },
  35. "item": [
  36. {
  37. "name": "🔐 Auth",
  38. "item": [
  39. {
  40. "name": "[POST] 로그인",
  41. "event": [
  42. {
  43. "listen": "test",
  44. "script": {
  45. "exec": [
  46. "var json = pm.response.json();",
  47. "if (json.success && json.data) {",
  48. " pm.collectionVariables.set('accessToken', json.data.accessToken);",
  49. " pm.collectionVariables.set('refreshToken', json.data.refreshToken);",
  50. " console.log('AccessToken, RefreshToken 저장 완료');",
  51. "}"
  52. ],
  53. "type": "text/javascript"
  54. }
  55. }
  56. ],
  57. "request": {
  58. "auth": {
  59. "type": "noauth"
  60. },
  61. "method": "POST",
  62. "header": [
  63. {
  64. "key": "Content-Type",
  65. "value": "application/json"
  66. }
  67. ],
  68. "body": {
  69. "mode": "raw",
  70. "raw": "{\n \"email\": \"test@bitforum.io\",\n \"password\": \"password123\"\n}"
  71. },
  72. "url": {
  73. "raw": "{{baseUrl}}/api/auth/login",
  74. "host": ["{{baseUrl}}"],
  75. "path": ["api", "auth", "login"]
  76. },
  77. "description": "로그인 후 accessToken, refreshToken이 자동으로 컬렉션 변수에 저장됩니다."
  78. },
  79. "response": []
  80. },
  81. {
  82. "name": "[POST] 로그아웃",
  83. "event": [
  84. {
  85. "listen": "test",
  86. "script": {
  87. "exec": [
  88. "var json = pm.response.json();",
  89. "if (json.success) {",
  90. " pm.collectionVariables.set('accessToken', '');",
  91. " pm.collectionVariables.set('refreshToken', '');",
  92. " console.log('토큰 초기화 완료');",
  93. "}"
  94. ],
  95. "type": "text/javascript"
  96. }
  97. }
  98. ],
  99. "request": {
  100. "method": "POST",
  101. "header": [
  102. {
  103. "key": "Content-Type",
  104. "value": "application/json"
  105. }
  106. ],
  107. "body": {
  108. "mode": "raw",
  109. "raw": "{\n \"refreshToken\": \"{{refreshToken}}\"\n}"
  110. },
  111. "url": {
  112. "raw": "{{baseUrl}}/api/auth/logout",
  113. "host": ["{{baseUrl}}"],
  114. "path": ["api", "auth", "logout"]
  115. },
  116. "description": "로그아웃. RefreshToken을 서버에서 폐기합니다.\n\n- Bearer 토큰 필요\n- 성공 시 컬렉션 변수의 토큰이 자동 초기화됩니다.\n- 이미 폐기된 토큰이면 그냥 성공 반환"
  117. },
  118. "response": []
  119. }
  120. ]
  121. },
  122. {
  123. "name": "📧 이메일",
  124. "item": [
  125. {
  126. "name": "[POST] 이메일 변경",
  127. "request": {
  128. "method": "POST",
  129. "header": [
  130. {
  131. "key": "Content-Type",
  132. "value": "application/json"
  133. }
  134. ],
  135. "body": {
  136. "mode": "raw",
  137. "raw": "{\n \"newEmail\": \"newemail@bitforum.io\"\n}"
  138. },
  139. "url": {
  140. "raw": "{{baseUrl}}/api/mypage/email",
  141. "host": ["{{baseUrl}}"],
  142. "path": ["api", "mypage", "email"]
  143. },
  144. "description": "이메일 변경 요청. 새 이메일로 인증 메일이 발송됩니다.\n\n- 중복 이메일 불가\n- 현재 이메일과 동일하면 에러\n- 변경 즉시 이메일이 바뀌고, IsEmailVerified가 false로 변경"
  145. },
  146. "response": []
  147. },
  148. {
  149. "name": "[GET] 이메일 인증",
  150. "request": {
  151. "auth": {
  152. "type": "noauth"
  153. },
  154. "method": "GET",
  155. "header": [],
  156. "url": {
  157. "raw": "{{baseUrl}}/api/mypage/email/verify?token=YOUR_TOKEN_HERE",
  158. "host": ["{{baseUrl}}"],
  159. "path": ["api", "mypage", "email", "verify"],
  160. "query": [
  161. {
  162. "key": "token",
  163. "value": "YOUR_TOKEN_HERE",
  164. "description": "이메일 인증 토큰 (이메일 변경 시 발송된 링크에 포함)"
  165. }
  166. ]
  167. },
  168. "description": "이메일 인증 토큰으로 이메일 인증 완료.\n\n- 인증 불필요 (Anonymous)\n- 토큰 만료: 24시간\n- 이미 인증된 토큰은 재사용 불가"
  169. },
  170. "response": []
  171. }
  172. ]
  173. },
  174. {
  175. "name": "👤 별명",
  176. "item": [
  177. {
  178. "name": "[POST] 별명 변경",
  179. "request": {
  180. "method": "POST",
  181. "header": [
  182. {
  183. "key": "Content-Type",
  184. "value": "application/json"
  185. }
  186. ],
  187. "body": {
  188. "mode": "raw",
  189. "raw": "{\n \"name\": \"새별명\"\n}"
  190. },
  191. "url": {
  192. "raw": "{{baseUrl}}/api/mypage/name",
  193. "host": ["{{baseUrl}}"],
  194. "path": ["api", "mypage", "name"]
  195. },
  196. "description": "별명 변경.\n\n- 최대 40자\n- 중복 별명 불가\n- 변경 로그 기록됨"
  197. },
  198. "response": []
  199. },
  200. {
  201. "name": "[DELETE] 별명 삭제",
  202. "request": {
  203. "method": "DELETE",
  204. "header": [],
  205. "url": {
  206. "raw": "{{baseUrl}}/api/mypage/name",
  207. "host": ["{{baseUrl}}"],
  208. "path": ["api", "mypage", "name"]
  209. },
  210. "description": "별명 삭제 (null로 초기화).\n\n- 이미 비어있으면 에러\n- 삭제 로그 기록됨"
  211. },
  212. "response": []
  213. }
  214. ]
  215. },
  216. {
  217. "name": "💬 한마디",
  218. "item": [
  219. {
  220. "name": "[POST] 한마디 변경",
  221. "request": {
  222. "method": "POST",
  223. "header": [
  224. {
  225. "key": "Content-Type",
  226. "value": "application/json"
  227. }
  228. ],
  229. "body": {
  230. "mode": "raw",
  231. "raw": "{\n \"summary\": \"안녕하세요! 비트포럼입니다.\"\n}"
  232. },
  233. "url": {
  234. "raw": "{{baseUrl}}/api/mypage/summary",
  235. "host": ["{{baseUrl}}"],
  236. "path": ["api", "mypage", "summary"]
  237. },
  238. "description": "한마디(상태 메시지) 변경.\n\n- 최대 50자\n- 변경 로그 기록됨"
  239. },
  240. "response": []
  241. },
  242. {
  243. "name": "[DELETE] 한마디 삭제",
  244. "request": {
  245. "method": "DELETE",
  246. "header": [],
  247. "url": {
  248. "raw": "{{baseUrl}}/api/mypage/summary",
  249. "host": ["{{baseUrl}}"],
  250. "path": ["api", "mypage", "summary"]
  251. },
  252. "description": "한마디 삭제 (null로 초기화).\n\n- 이미 비어있으면 에러\n- 삭제 로그 기록됨"
  253. },
  254. "response": []
  255. }
  256. ]
  257. },
  258. {
  259. "name": "📝 자기소개",
  260. "item": [
  261. {
  262. "name": "[POST] 자기소개 변경",
  263. "request": {
  264. "method": "POST",
  265. "header": [
  266. {
  267. "key": "Content-Type",
  268. "value": "application/json"
  269. }
  270. ],
  271. "body": {
  272. "mode": "raw",
  273. "raw": "{\n \"intro\": \"비트코인과 블록체인에 관심이 많은 개발자입니다.\"\n}"
  274. },
  275. "url": {
  276. "raw": "{{baseUrl}}/api/mypage/intro",
  277. "host": ["{{baseUrl}}"],
  278. "path": ["api", "mypage", "intro"]
  279. },
  280. "description": "자기소개 변경.\n\n- 최대 3000자\n- 변경 로그 기록됨"
  281. },
  282. "response": []
  283. },
  284. {
  285. "name": "[DELETE] 자기소개 삭제",
  286. "request": {
  287. "method": "DELETE",
  288. "header": [],
  289. "url": {
  290. "raw": "{{baseUrl}}/api/mypage/intro",
  291. "host": ["{{baseUrl}}"],
  292. "path": ["api", "mypage", "intro"]
  293. },
  294. "description": "자기소개 삭제 (null로 초기화).\n\n- 이미 비어있으면 에러\n- 삭제 로그 기록됨"
  295. },
  296. "response": []
  297. }
  298. ]
  299. },
  300. {
  301. "name": "🔔 수신설정",
  302. "item": [
  303. {
  304. "name": "[POST] 수신설정 변경",
  305. "request": {
  306. "method": "POST",
  307. "header": [
  308. {
  309. "key": "Content-Type",
  310. "value": "application/json"
  311. }
  312. ],
  313. "body": {
  314. "mode": "raw",
  315. "raw": "{\n \"isReceiveSMS\": true,\n \"isReceiveEmail\": true,\n \"isReceiveNote\": false\n}"
  316. },
  317. "url": {
  318. "raw": "{{baseUrl}}/api/mypage/receive-settings",
  319. "host": ["{{baseUrl}}"],
  320. "path": ["api", "mypage", "receive-settings"]
  321. },
  322. "description": "SMS/이메일/쪽지 수신 설정 변경.\n\n- 변경된 항목만 동의 시간이 업데이트됩니다."
  323. },
  324. "response": []
  325. }
  326. ]
  327. },
  328. {
  329. "name": "🔒 보안",
  330. "item": [
  331. {
  332. "name": "[POST] 비밀번호 변경",
  333. "request": {
  334. "method": "POST",
  335. "header": [
  336. {
  337. "key": "Content-Type",
  338. "value": "application/json"
  339. }
  340. ],
  341. "body": {
  342. "mode": "raw",
  343. "raw": "{\n \"currentPassword\": \"password123\",\n \"newPassword\": \"newpassword456\",\n \"confirmPassword\": \"newpassword456\"\n}"
  344. },
  345. "url": {
  346. "raw": "{{baseUrl}}/api/mypage/password",
  347. "host": ["{{baseUrl}}"],
  348. "path": ["api", "mypage", "password"]
  349. },
  350. "description": "비밀번호 변경.\n\n- 현재 비밀번호 검증 필수\n- 새 비밀번호 6자 이상\n- newPassword와 confirmPassword 일치 필요"
  351. },
  352. "response": []
  353. },
  354. {
  355. "name": "[POST] 회원탈퇴",
  356. "request": {
  357. "method": "POST",
  358. "header": [
  359. {
  360. "key": "Content-Type",
  361. "value": "application/json"
  362. }
  363. ],
  364. "body": {
  365. "mode": "raw",
  366. "raw": "{\n \"password\": \"password123\"\n}"
  367. },
  368. "url": {
  369. "raw": "{{baseUrl}}/api/mypage/withdraw",
  370. "host": ["{{baseUrl}}"],
  371. "path": ["api", "mypage", "withdraw"]
  372. },
  373. "description": "회원 탈퇴.\n\n- 비밀번호 검증 필수\n- 모든 RefreshToken 무효화\n- IsWithdraw = true, DeletedAt 설정 (소프트 삭제)"
  374. },
  375. "response": []
  376. },
  377. {
  378. "name": "[GET] 로그인 기록",
  379. "request": {
  380. "method": "GET",
  381. "header": [],
  382. "url": {
  383. "raw": "{{baseUrl}}/api/mypage/login-logs?page=1&pageSize=20",
  384. "host": ["{{baseUrl}}"],
  385. "path": ["api", "mypage", "login-logs"],
  386. "query": [
  387. {
  388. "key": "page",
  389. "value": "1",
  390. "description": "페이지 번호 (기본값: 1)"
  391. },
  392. {
  393. "key": "pageSize",
  394. "value": "20",
  395. "description": "페이지 크기 (기본값: 20, 최대: 50)"
  396. }
  397. ]
  398. },
  399. "description": "로그인 기록 조회.\n\n- 최신순 정렬\n- 페이지네이션 지원 (page, pageSize)\n- 응답: items[], totalCount, page, pageSize"
  400. },
  401. "response": []
  402. }
  403. ]
  404. }
  405. ]
  406. }