-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.yaml
More file actions
1 lines (1 loc) · 48.3 KB
/
api.yaml
File metadata and controls
1 lines (1 loc) · 48.3 KB
1
{"openapi":"3.0.1","info":{"title":"Quacker","description":"Quacker API 명세서.","version":"v1"},"servers":[{"url":"","description":"Generated server url"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"관리자 인증 API","description":"관리자 인증 관련 API"},{"name":"관리자 유저 관리 api","description":"어드민 API"},{"name":"게시글 API","description":"게시글 작성, 조회, 수정, 삭제 기능을 제공합니다."},{"name":"댓글 API","description":"게시글에 댓글을 등록, 조회, 수정, 삭제하는 API입니다."},{"name":"관리자 게시물 관리 api","description":"어드민 API"},{"name":"해시태그 API","description":"해시태그를 조회하고 관리하는 API입니다."},{"name":"User Following","description":"유저 팔로잉 관련 API"},{"name":"게시글 이미지 API","description":"게시글에 등록된 이미지들을 조회, 수정, 삭제하는 API입니다."},{"name":"유저 API","description":"유저 조회, 수정 API"},{"name":"사용자 인증 API","description":"유저 인증 관련 API"}],"paths":{"/api/v1/users/{userId}/edit":{"put":{"tags":["유저 API"],"summary":"프로필 수정","description":"사용자의 프로필을 수정합니다.","operationId":"editProfile","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateDto"}}},"required":true},"responses":{"200":{"description":"OK","content":{"applicaion/json":{"examples":{"조회 성공":{"description":"UserUpdateDto로 수정합니다","value":{"id":1,"email":"quacker2025@gamil.com","name":"newOne","bio":null,"avatarImageUrl":null,"isVerified":false,"isLocked":false,"isPrivate":false,"posts":null}}}}}}}}},"/api/v1/posts/{postId}/comments/{commentId}":{"put":{"tags":["댓글 API"],"summary":"댓글 수정","description":"특정 댓글의 내용을 수정합니다.","operationId":"updateComment","parameters":[{"name":"commentId","in":"path","description":"댓글 ID","required":true,"schema":{"type":"integer","format":"int64"},"example":1},{"name":"text","in":"query","description":"수정할 댓글 내용","required":true,"schema":{"type":"string"},"example":"수정된 댓글입니다."}],"responses":{"200":{"description":"수정 성공","content":{"application/json":{"examples":{"수정 성공 예시":{"description":"수정 성공 예시","value":{"id":1,"text":"수정된 댓글입니다.","postId":3,"userId":2}}}}}},"404":{"description":"댓글 없음","content":{"application/json":{"examples":{"댓글 없음 예시":{"description":"댓글 없음 예시","value":{"message":"댓글을 찾을 수 없습니다."}}}}}}}},"delete":{"tags":["댓글 API"],"summary":"댓글 삭제","description":"특정 댓글을 삭제합니다.","operationId":"deleteComment","parameters":[{"name":"commentId","in":"path","description":"댓글 ID","required":true,"schema":{"type":"integer","format":"int64"},"example":1}],"responses":{"204":{"description":"삭제 성공"},"404":{"description":"댓글 없음","content":{"application/json":{"examples":{"댓글 없음 예시":{"description":"댓글 없음 예시","value":{"message":"댓글을 찾을 수 없습니다."}}}}}}}}},"/api/v1/auth/verify-email":{"put":{"tags":["사용자 인증 API"],"summary":"코드 인증","description":"인증 코드를 검증합니다.","operationId":"verifyEmail","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/이메일 인증코드 Dto"}}},"required":true},"responses":{"404":{"description":"Not Found","content":{"application/json":{"examples":{"토큰 누락/코드 불일치":{"description":"토큰 누락/코드 불일치","value":{"message":"Bad request. Invalid authentication."}}}}}},"200":{"description":"OK","content":{"application/json":{"examples":{"인증성공":{"description":"인증성공","value":{"isVerified":true}}}}}}}}},"/api/v1/auth/reset-password":{"put":{"tags":["사용자 인증 API"],"summary":"코드 인증","description":"인증 코드를 검증합니다.","operationId":"resetPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResetPasswordDto"}}},"required":true},"responses":{"404":{"description":"Not Found","content":{"application/json":{"examples":{"토큰 누락":{"description":"토큰 누락","value":{"message":"Bad request. Invalid authentication."}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"examples":{"코드 불일치":{"description":"코드 불일치","value":{"errorMessage":"코드 인증 실패","httpStatusCode":400}},"만료된 인증코드/인증을 찾을 수 없음":{"description":"만료된 인증코드/인증을 찾을 수 없음","value":{"errorMessage":"만료되거나 존재하지않은 인증","httpStatusCode":400}}}}}},"200":{"description":"OK","content":{"application/json":{"examples":{"인증성공":{"description":"인증성공","value":{"isVerified":true}}}}}}}}},"/api/v1/users/{userId}/delete":{"post":{"tags":["유저 API"],"summary":"계정 삭제 요청","description":"계정 삭제를 요청합니다.","operationId":"requestDelete","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"applicaion/json":{"examples":{"요청 성공":{"description":"요청 성공","value":{"requestAt":"2025-03-28T02:35:07.582+00:00","deleteAt":"2025-03-28T02:36:07.582+00:00"}}}}}}}}},"/api/v1/users/{userId}/abort":{"post":{"tags":["유저 API"],"summary":"삭제요청 취소","description":"계정삭제 중단합니다.","operationId":"abort","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"applicaion/json":{"examples":{"요청 성공":{"description":"요청 성공","value":"{\n \"result: true\n}\n"}}}}}}}},"/api/v1/users/followings":{"post":{"tags":["User Following"],"operationId":"addFollowing","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FollowRequestDto"}}},"required":true},"responses":{"201":{"description":"Created","content":{"application/json":{"examples":{"유저 팔로잉 성공":{"description":"유저 팔로잉 성공","value":{"userId":1,"name":"이름","bio":"bio","profileImageUrl":"https://example.com/abc.jpg"}}}}}},"409":{"description":"Conflict","content":{"application/json":{"examples":{"팔로잉 실패 - 이미 등록한 팔로잉":{"description":"팔로잉 실패 - 이미 등록한 팔로잉","value":{"message":"이미 팔로잉 한 유저 입니다."}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"examples":{"팔로잉 실패 - 자기 자신 팔로잉":{"description":"팔로잉 실패 - 자기 자신 팔로잉","value":{"message":"자기 자신을 팔로잉 할 수 없습니다."}}}}}}}}},"/api/v1/posts":{"get":{"tags":["게시글 API"],"summary":"게시글 목록 조회","description":"정렬 및 페이징 정보를 받아 게시글 목록을 조회합니다.","operationId":"getAllPosts","parameters":[{"name":"sortBy","in":"query","description":"정렬 방식 (newest, likes)","required":false,"schema":{"type":"string","default":"newest","enum":["NEWEST","LIKES"]},"example":"newest"},{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":20}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"목록 조회 성공","content":{"application/json":{"examples":{"게시글 목록 예시":{"description":"게시글 목록 예시","value":{"content":[{"id":1,"text":"게시글 내용","likeCount":15,"repostCount":3,"user":{"userId":1,"name":"홍길동","bio":"백엔드 개발자","profileImageUrl":"https://example.com/profile.jpg"},"imageUrls":[]}],"pageable":{"pageNumber":0,"pageSize":10},"totalPages":1,"totalElements":1}}}}}},"400":{"description":"잘못된 요청 (정렬 파라미터가 유효하지 않음)","content":{"application/json":{"examples":{"정렬 값 오류":{"description":"정렬 값 오류","value":{"message":"지원하지 않는 정렬 방식입니다. (newest 또는 likes)"}}}}}}}},"post":{"tags":["게시글 API"],"summary":"게시글 작성","operationId":"createPost","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PostCreateRequestDto"}}}},"responses":{"400":{"description":"요청 실패","content":{"application/json":{"examples":{"본문 누락":{"description":"본문 누락","value":{"message":"본문은 공백일 수 없습니다."}}}}}},"201":{"description":"작성 성공","content":{"application/json":{"examples":{"작성 성공":{"description":"작성 성공","value":{"id":1,"text":"안녕하세요, 첫 게시글입니다!","likeCount":0,"repostCount":0,"user":{"userId":1,"name":"홍길동","bio":"백엔드 개발자","profileImageUrl":"https://example.com/profile.jpg"},"imageUrls":["https://quacker-image.s3.ap-northeast-2.amazonaws.com/image1.jpg"]}}}}}}}}},"/api/v1/posts/{postId}":{"get":{"tags":["게시글 API"],"summary":"게시글 상세 조회","description":"게시글 ID를 기반으로 특정 게시글의 상세 정보를 조회합니다.","operationId":"getPost","parameters":[{"name":"postId","in":"path","description":"게시글 ID","required":true,"schema":{"type":"integer","format":"int64"},"example":10}],"responses":{"200":{"description":"게시글 조회 성공","content":{"application/json":{"examples":{"게시글 조회 예시":{"description":"게시글 조회 예시","value":{"id":10,"text":"오늘은 날씨가 좋아요.","likeCount":12,"repostCount":3,"user":{"userId":2,"name":"홍길동","bio":"백엔드 개발자","profileImageUrl":"https://example.com/profile.jpg"},"originPost":null,"imageUrls":["https://example.com/image1.jpg","https://example.com/image2.jpg"]}}}}}},"404":{"description":"해당 ID의 게시글이 존재하지 않습니다.","content":{"application/json":{"examples":{"게시글 조회 실패":{"description":"게시글 조회 실패","value":{"message":"게시글을 찾을 수 없습니다."}}}}}}}},"post":{"tags":["게시글 API"],"summary":"게시글 리포스트","description":"기존 게시글을 리포스트합니다. 선택적으로 텍스트를 함께 작성할 수 있습니다.","operationId":"repost","parameters":[{"name":"postId","in":"path","description":"리포스트할 게시글 ID","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostDto"}}}},"responses":{"404":{"description":"게시글을 찾을 수 없음","content":{"application/json":{"examples":{"리포스트 실패":{"description":"리포스트 실패","value":{"message":"Post not found"}}}}}},"201":{"description":"리포스트 성공","content":{"application/json":{"examples":{"리포스트 성공":{"description":"리포스트 성공","value":{"id":10,"text":"공유하고 싶은 게시글이에요!","likeCount":0,"repostCount":0,"user":{"userId":2,"name":"홍길동","bio":"백엔드 개발자","profileImageUrl":"https://example.com/profile.jpg"},"originPost":{"id":5,"text":"원본 게시글입니다.","likeCount":15,"repostCount":3,"user":{"userId":1,"name":"원글 작성자","bio":"프론트엔드 개발자","profileImageUrl":"https://example.com/profile2.jpg"},"imageUrls":[]},"imageUrls":[]}}}}}}}},"delete":{"tags":["게시글 API"],"summary":"게시글 삭제","description":"게시글 ID를 통해 특정 게시글을 삭제합니다. 삭제 권한은 게시글 작성자에게만 있습니다.","operationId":"deletePost","parameters":[{"name":"postId","in":"path","description":"삭제할 게시글 ID","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"404":{"description":"게시글 없음","content":{"application/json":{"examples":{"게시글 없음":{"description":"게시글 없음","value":{"message":"Post not found"}}}}}},"204":{"description":"게시글 삭제 성공 (내용 없음)"},"403":{"description":"삭제 권한 없음","content":{"application/json":{"examples":{"권한 없음":{"description":"권한 없음","value":{"message":"작성자만 게시글을 삭제할 수 있습니다."}}}}}}}},"patch":{"tags":["게시글 API"],"summary":"게시글 수정","description":"게시글의 텍스트와 이미지를 수정합니다. 텍스트와 이미지는 선택적으로 수정 가능합니다.","operationId":"updatePost","parameters":[{"name":"postId","in":"path","description":"게시글 ID","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/PostUpdateRequestDto"}}}},"responses":{"200":{"description":"게시글 수정 성공","content":{"application/json":{"examples":{"수정 성공":{"description":"수정 성공","value":{"id":1,"text":"수정된 게시글 내용입니다.","likeCount":5,"repostCount":2,"user":{"userId":1,"name":"홍길동","bio":"백엔드 개발자","profileImageUrl":"https://example.com/profile.jpg"},"imageUrls":["https://quacker-image.s3.ap-northeast-2.amazonaws.com/image1.jpg","https://quacker-image.s3.ap-northeast-2.amazonaws.com/image2.jpg"]}}}}}},"404":{"description":"게시글을 찾을 수 없음","content":{"application/json":{"examples":{"게시글 없음":{"description":"게시글 없음","value":{"message":"Post not found"}}}}}},"400":{"description":"수정 요청 실패","content":{"application/json":{"examples":{"잘못된 입력":{"description":"잘못된 입력","value":{"message":"이미지는 최대 4개까지 업로드할 수 있습니다."}}}}}}}}},"/api/v1/posts/{postId}/like":{"get":{"tags":["post-like-controller"],"operationId":"getLikeStatus","parameters":[{"name":"postId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PostLikeResponse"}}}}}},"post":{"tags":["post-like-controller"],"operationId":"toggleLike","parameters":[{"name":"postId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PostLikeResponse"}}}}}}},"/api/v1/posts/{postId}/comments":{"get":{"tags":["댓글 API"],"summary":"게시글의 모든 댓글 조회","description":"특정 게시글에 작성된 모든 댓글을 조회합니다.","operationId":"getByPost","parameters":[{"name":"postId","in":"path","description":"게시글 ID","required":true,"schema":{"type":"integer","format":"int64"},"example":3}],"responses":{"200":{"description":"댓글 목록","content":{"application/json":{"examples":{"댓글 리스트":{"description":"댓글 리스트","value":[{"id":1,"text":"첫 번째 댓글","postId":3,"userId":2},{"id":2,"text":"두 번째 댓글","postId":3,"userId":4}]}}}}}}},"post":{"tags":["댓글 API"],"summary":"댓글 작성","description":"특정 게시글에 댓글을 작성합니다.","operationId":"addComment","parameters":[{"name":"postId","in":"path","description":"게시글 ID","required":true,"schema":{"type":"integer","format":"int64"},"example":3}],"requestBody":{"description":"댓글 작성 요청","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentCreateRequest"}}},"required":true},"responses":{"201":{"description":"댓글 작성 완료","content":{"application/json":{"examples":{"작성 성공":{"description":"작성 성공","value":{"id":1,"text":"댓글 내용","postId":3,"userId":2}}}}}},"404":{"description":"게시글을 찾을 수 없음","content":{"application/json":{"examples":{"게시글 없음":{"description":"게시글 없음","value":{"message":"게시글이 존재하지 않습니다"}}}}}}}}},"/api/v1/auth/{userId}/logout":{"post":{"tags":["사용자 인증 API"],"summary":"로그아웃","description":"쿠키로 소지중인 토큰을 모두 만료시킵니다","operationId":"logout","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"accessToken","in":"cookie","required":true,"schema":{"type":"string"}},{"name":"refreshToken","in":"cookie","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"중복":{"description":"중복","value":{"result":true}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"examples":{"중복":{"description":"중복","value":{"message":"Bad request. Invalid authentication."}}}}}}}}},"/api/v1/auth/send-code":{"post":{"tags":["사용자 인증 API"],"summary":"이메일 인증 발송","description":"사용자 인증용 코드를 발송하고 서버가 보관합니다.","operationId":"createEmailSession","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/이메일 Dto"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"중복":{"description":"중복","value":{"sentAT":"2025-03-27T05:00:52.381+00:00"}}}}}},"404":{"description":"Not Found","content":{"application/json":{"examples":{"존재하지 않는 유저":{"description":"존재하지 않는 유저","value":{"errorMessage":"유저를 찾을 수 없음","httpStatusCode":404}}}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["사용자 인증 API"],"summary":"토큰 재발급","description":"리프레시토큰을 블랙리스트에 등록하고, 두 토큰을 재발급합니다.","operationId":"refresh","parameters":[{"name":"refreshToken","in":"cookie","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"재발급 성공, 토큰이 해더로 발급됩니다.","headers":{"accessToken":{"description":"엑세스 토큰","style":"simple","schema":{"type":"string"}},"refreshToken":{"description":"리프레시 토큰","style":"simple","schema":{"type":"string"}}},"content":{"application/json":{"examples":{"발급성공":{"description":"발급성공","value":{"result":true}}}}}}}}},"/api/v1/auth/login":{"post":{"tags":["사용자 인증 API"],"summary":"로그인","description":"로그인을 수행합니다.","operationId":"login","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserLoginDto"}}},"required":true},"responses":{"200":{"description":"사용자 로그인 성공, 토큰이 해더로 발급됩니다.","headers":{"accessToken":{"description":"엑세스 토큰","style":"simple","schema":{"type":"string"}},"refreshToken":{"description":"리프레시 토큰","style":"simple","schema":{"type":"string"}}},"content":{"application/json":{"examples":{"유저 로그인 성공":{"description":"유저 로그인 성공","value":{"id":1,"email":"quacker2025@gamil.com","name":"Username","bio":"Hello world!","avatarImageUrl":"https://img.icons8.com/color-pixels/32/duck.png","isVerified":false,"isLocked":false,"isPrivate":false,"posts":null}}}}}},"404":{"description":"존재하지 않는 사용자","content":{"application/json":{"examples":{"유저를 찾을 수 없음":{"description":"유저를 찾을 수 없음","value":{"errorMessage":"유저를 찾을 수 없음","httpStatusCode":404}},"비밀번호가 일치하지않음":{"description":"비밀번호가 일치하지않음","value":{"errorMessage":"비밀번호가 일치하지 않음","httpStatusCode":400}}}}}}}}},"/api/v1/auth/join":{"post":{"tags":["사용자 인증 API"],"summary":"가입","description":"회원가입을 수행합니다.","operationId":"join","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateDto"}}},"required":true},"responses":{"409":{"description":"Conflict","content":{"application/json":{"examples":{"이메일 중복":{"description":"이메일 중복","value":{"errorMessage":"사용할 수 없는 이메일","httpStatusCode":409}}}}}},"404":{"description":"Not Found","content":{"application/json":{"examples":{"존재하지 않는 유저":{"description":"존재하지 않는 유저","value":{"errorMessage":"유저를 찾을 수 없음","httpStatusCode":404}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"examples":{"유저 로그인 실패":{"description":"유저 로그인 실패","value":{"errorMessage":"Bad request. Invalid authentication."}},"확인 비밀번호 불일치":{"description":"확인 비밀번호 불일치","value":{"errorMessage":"비밀번호가 일치하지 않음","httpStatusCode":400}}}}}},"201":{"description":"Created","content":{"application/json":{"examples":{"회원가입 성공":{"description":"회원가입 성공","value":{"id":1,"email":"quacker2025@gamil.com","name":"Username","bio":"Hello world!","avatarImageUrl":"https://img.icons8.com/color-pixels/32/duck.png","isVerified":false,"isLocked":false,"isPrivate":false,"posts":null}}}}}}}}},"/api/v1/auth/duplicate-email":{"post":{"tags":["사용자 인증 API"],"summary":"이메일 중복 확인","description":"이메일의 중복여부를 확인합니다.","operationId":"duplicateEmail","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/이메일 Dto"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"중복":{"description":"중복","value":{"result":true}},"중복이 아님":{"description":"중복이 아님","value":{"result":false}}}}}}}}},"/api/v1/admins/auth/refresh":{"post":{"tags":["관리자 인증 API"],"summary":"토큰 재발급","description":"리프레시토큰을 블랙리스트에 등록하고, 두 토큰을 재발급합니다.","operationId":"refresh_1","parameters":[{"name":"adminRefreshToken","in":"cookie","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"재발급 성공, 토큰이 해더로 발급됩니다.","headers":{"adminRefreshToken":{"description":"리프레시 토큰","style":"simple","schema":{"type":"string"}},"adminAccessToken":{"description":"엑세스 토큰","style":"simple","schema":{"type":"string"}}},"content":{"application/json":{"examples":{"발급성공":{"description":"발급성공","value":{"result":true}}}}}}}}},"/api/v1/admins/auth/logout":{"post":{"tags":["관리자 인증 API"],"summary":"로그아웃","description":"쿠키로 소지중인 토큰을 모두 만료시킵니다","operationId":"logout_1","parameters":[{"name":"adminAccessToken","in":"cookie","required":true,"schema":{"type":"string"}},{"name":"adminRefreshToken","in":"cookie","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"중복":{"description":"중복","value":{"result":true}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"examples":{"중복":{"description":"중복","value":{"message":"Bad request. Invalid authentication."}}}}}}}}},"/api/v1/admins/auth/login":{"post":{"tags":["관리자 인증 API"],"summary":"로그인","description":"로그인을 수행합니다.","operationId":"login_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminLoginDto"}}},"required":true},"responses":{"200":{"description":"사용자 로그인 성공, 토큰이 해더로 발급됩니다.","headers":{"adminRefreshToken":{"description":"리프레시 토큰","style":"simple","schema":{"type":"string"}},"adminAccessToken":{"description":"엑세스 토큰","style":"simple","schema":{"type":"string"}}},"content":{"application/json":{"examples":{"유저 로그인 성공":{"description":"유저 로그인 성공","value":{"result":true}}}}}},"404":{"description":"존재하지 않는 사용자","content":{"application/json":{"examples":{"유저를 찾을 수 없음":{"description":"유저를 찾을 수 없음","value":{"errorMessage":"관리자를 찾을 수 없음","httpStatusCode":404}},"비밀번호가 일치하지않음":{"description":"비밀번호가 일치하지않음","value":{"errorMessage":"비밀번호가 일치하지 않음","httpStatusCode":400}}}}}}}}},"/api/v1/admins/auth/join":{"post":{"tags":["관리자 인증 API"],"summary":"가입","description":"회원가입을 수행합니다.","operationId":"join_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreateDto"}}},"required":true},"responses":{"409":{"description":"Conflict","content":{"application/json":{"examples":{"이메일 중복":{"description":"이메일 중복","value":{"errorMessage":"사용할 수 없는 이메일","httpStatusCode":409}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"examples":{"유저 로그인 실패":{"description":"유저 로그인 실패","value":{"errorMessage":"Bad request. Invalid authentication."}},"확인 비밀번호 불일치":{"description":"확인 비밀번호 불일치","value":{"errorMessage":"비밀번호가 일치하지 않음","httpStatusCode":400}}}}}},"201":{"description":"Created","content":{"application/json":{"examples":{"회원가입 성공":{"description":"회원가입 성공","value":{"result":true}}}}}},"404":{"description":"Not Found","content":{"application/json":{"examples":{"존재하지 않는 유저":{"description":"존재하지 않는 유저","value":{"errorMessage":"관리자를 찾을 수 없음","httpStatusCode":404}}}}}}}}},"/api/v1/users/{userId}/visibility":{"patch":{"tags":["유저 API"],"summary":"비공개 토글","description":"계정 비공개 여부를 토글합니다.","operationId":"toggleVisibility","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"applicaion/json":{"examples":{"성공":{"description":"성공","value":{"isPrivate":true}}}}}}}}},"/api/v1/posts/{postId}/images/{imageId}":{"delete":{"tags":["게시글 이미지 API"],"summary":"이미지 삭제","description":"특정 게시글의 이미지를 삭제합니다.","operationId":"deleteImage","parameters":[{"name":"postId","in":"path","description":"게시글 ID","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"imageId","in":"path","description":"삭제할 이미지 ID","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"404":{"description":"이미지를 찾을 수 없음","content":{"application/json":{"examples":{"에러 예시":{"description":"에러 예시","value":{"message":"Image not found"}}}}}},"204":{"description":"이미지 삭제 성공"}}},"patch":{"tags":["게시글 이미지 API"],"summary":"이미지 URL 수정","description":"특정 이미지의 URL을 새로운 URL로 수정합니다.","operationId":"updateImage","parameters":[{"name":"postId","in":"path","description":"게시글 ID","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"imageId","in":"path","description":"수정할 이미지 ID","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"newImageUrl","in":"query","description":"새로운 이미지 URL","required":true,"schema":{"type":"string"}}],"responses":{"404":{"description":"이미지를 찾을 수 없음","content":{"application/json":{"examples":{"에러 예시":{"description":"에러 예시","value":{"message":"Image not found"}}}}}},"200":{"description":"이미지 URL 수정 성공","content":{"application/json":{"examples":{"수정 성공":{"description":"수정 성공","value":{"id":10,"imageUrl":"https://quacker-image.s3.ap-northeast-2.amazonaws.com/updated.jpg"}}}}}}}}},"/api/v1/users/{userId}":{"get":{"tags":["유저 API"],"summary":"프로필 조회","description":"사용자의 프로필을 조회합니다.","operationId":"getProfile","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"400":{"description":"Bad Request","content":{"applicaion/json":{"examples":{"유저를 찾을 수 없음":{"description":"유저를 찾을 수 없음","value":{"errorMessage":"유저를 찾을 수 없음","httpStatusCode":400}}}}}},"200":{"description":"OK","content":{"applicaion/json":{"examples":{"조회 성공":{"description":"조회 성공","value":{"id":1,"email":"quacker2025@gamil.com","name":"Username","bio":"Hello world!","avatarImageUrl":"https://img.icons8.com/color-pixels/32/duck.png","isVerified":false,"isLocked":false,"isPrivate":false,"posts":null}}}}}}}}},"/api/v1/users/{userId}/mentions":{"get":{"tags":["post-mention-controller"],"operationId":"getPostByMentionUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}}}},"/api/v1/users/{userId}/followings":{"get":{"tags":["User Following"],"operationId":"getAllFollowingByUserId","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"팔로잉 유저 목록":{"description":"팔로잉 유저 목록","value":[{"userId":1,"name":"이름","bio":"bio","profileImageUrl":"https://example.com/abc.jpg"},{"userId":2,"name":"이름2","bio":"bio2","profileImageUrl":"https://example.com/bca.jpg"}]}}}}}}}},"/api/v1/users/{userId}/followers":{"get":{"tags":["User Following"],"operationId":"getAllFollowerByUserId","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"팔로워 유저 목록":{"description":"팔로워 유저 목록","value":[{"userId":4,"name":"이름3","bio":"bio","profileImageUrl":"https://example.com/abc.jpg"},{"userId":5,"name":"이름4","bio":"bio2","profileImageUrl":"https://example.com/bca.jpg"}]}}}}}}}},"/api/v1/posts/{postId}/images":{"get":{"tags":["게시글 이미지 API"],"summary":"게시글 이미지 목록 조회","description":"게시글 ID로 등록된 이미지들을 조회합니다.","operationId":"getImages","parameters":[{"name":"postId","in":"path","description":"게시글 ID","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"이미지 목록 조회 성공","content":{"application/json":{"examples":{"이미지 목록 예시":{"description":"이미지 목록 예시","value":[{"id":10,"imageUrl":"https://quacker-image.s3.ap-northeast-2.amazonaws.com/image1.jpg"},{"id":11,"imageUrl":"https://quacker-image.s3.ap-northeast-2.amazonaws.com/image2.jpg"}]}}}}}}}},"/api/v1/posts/user/{userId}":{"get":{"tags":["게시글 API"],"summary":"사용자 게시글 목록 조회","description":"현재 로그인한 사용자의 게시글 목록을 정렬 및 페이징 정보를 통해 조회합니다.","operationId":"getPostsByUser","parameters":[{"name":"sortBy","in":"query","description":"정렬 방식 (newest, likes)","required":false,"schema":{"type":"string","default":"newest","enum":["NEWEST","LIKES"]},"example":"likes"},{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":20}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"목록 조회 성공","content":{"application/json":{"examples":{"사용자 게시글 목록 예시":{"description":"사용자 게시글 목록 예시","value":{"content":[{"id":1,"text":"사용자 게시글 내용","likeCount":8,"repostCount":2,"user":{"userId":1,"name":"홍길동","bio":"백엔드 개발자","profileImageUrl":"https://example.com/profile.jpg"},"imageUrls":[]}],"pageable":{"pageNumber":0,"pageSize":10},"totalPages":1,"totalElements":1}}}}}},"400":{"description":"잘못된 정렬 파라미터","content":{"application/json":{"examples":{"정렬 방식 오류":{"description":"정렬 방식 오류","value":{"message":"지원하지 않는 정렬 방식입니다. (newest 또는 likes)"}}}}}}}}},"/api/v1/posts/search":{"get":{"tags":["게시글 API"],"summary":"게시글 검색","description":"키워드를 포함하는 게시글을 정렬 방식과 페이징 기준으로 검색합니다.<br>`keyword`는 필수이며, 정렬 방식은 `newest` 또는 `likes` 중 선택할 수 있습니다.","operationId":"searchPosts","parameters":[{"name":"keyword","in":"query","description":"검색 키워드","required":true,"schema":{"type":"string"},"example":"백엔드"},{"name":"sortBy","in":"query","description":"정렬 방식 (newest, likes)","required":false,"schema":{"type":"string","default":"newest","enum":["NEWEST","LIKES"]},"example":"newest"},{"name":"page","in":"query","description":"Zero-based page index (0..N)","required":false,"schema":{"minimum":0,"type":"integer","default":0}},{"name":"size","in":"query","description":"The size of the page to be returned","required":false,"schema":{"minimum":1,"type":"integer","default":20}},{"name":"sort","in":"query","description":"Sorting criteria in the format: property,(asc|desc). Default sort order is ascending. Multiple sort criteria are supported.","required":false,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"검색 성공","content":{"application/json":{"examples":{"검색 결과 예시":{"description":"검색 결과 예시","value":{"content":[{"id":5,"text":"이 게시글에는 검색 키워드가 포함되어 있습니다.","likeCount":10,"repostCount":1,"user":{"userId":2,"name":"유저이름","bio":"설명","profileImageUrl":"https://example.com/profile.jpg"},"imageUrls":[]}],"pageable":{"pageNumber":0,"pageSize":10},"totalPages":1,"totalElements":1}}}}}},"400":{"description":"검색 키워드 누락 또는 잘못된 정렬 파라미터","content":{"application/json":{"examples":{"파라미터 오류":{"description":"파라미터 오류","value":{"message":"검색 키워드는 필수입니다."}}}}}}}}},"/api/v1/hashtags/trending":{"get":{"tags":["해시태그 API"],"summary":"인기 해시태그 조회","description":"가장 많이 사용된 해시태그를 조회합니다.","operationId":"getTrendingHashtags","parameters":[{"name":"pageable","in":"query","description":"페이지 정보","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"인기 해시태그 목록","content":{"application/json":{"examples":{"인기 해시태그":{"description":"인기 해시태그","value":{"content":[{"id":1,"name":"스프링","postCount":10},{"id":2,"name":"자바","postCount":8}],"totalElements":2,"totalPages":1,"size":10,"number":0}}}}}}}}},"/api/v1/hashtags/search":{"get":{"tags":["해시태그 API"],"summary":"해시태그 검색","description":"입력된 키워드로 해시태그를 검색합니다.","operationId":"searchHashtags","parameters":[{"name":"query","in":"query","description":"검색할 키워드","required":true,"schema":{"type":"string"},"example":"스프링"},{"name":"pageable","in":"query","description":"페이지 정보","required":true,"schema":{"$ref":"#/components/schemas/Pageable"}}],"responses":{"200":{"description":"검색 성공","content":{"application/json":{"examples":{"검색 결과":{"description":"검색 결과","value":{"content":[{"id":1,"name":"스프링","postCount":5},{"id":2,"name":"스프링부트","postCount":3}],"totalElements":2,"totalPages":1,"size":10,"number":0}}}}}}}}},"/api/v1/auth/username/{username}":{"get":{"tags":["사용자 인증 API"],"summary":"사용자 이름 중복 확인","description":"사용자 이름의 중복여부를 확인합니다.","operationId":"duplicateUsername","parameters":[{"name":"userDto","in":"query","required":true,"schema":{"$ref":"#/components/schemas/UserDto"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"중복":{"description":"중복","value":{"result":true}},"중복이 아님":{"description":"중복이 아님","value":{"result":false}}}}}}}}},"/api/v1/auth/hint":{"get":{"tags":["사용자 인증 API"],"summary":"힌트 보기","description":"가입시 기입한 힌트로 마스킹된 이메일을 제공합니다. ","operationId":"getEmailhint","parameters":[{"name":"userHintDto","in":"query","required":true,"schema":{"$ref":"#/components/schemas/힌트 Dto"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"examples":{"회원가입 성공":{"description":"회원가입 성공","value":{"result":"quac****@gamil.com"}}}}}},"404":{"description":"Not Found","content":{"application/json":{"examples":{"일치하는 힌트가 없음":{"description":"일치하는 힌트가 없음","value":{"errorMessage":"유저를 찾을 수 없음","httpStatusCode":404}}}}}}}}},"/api/v1/users/followings/{userId}":{"delete":{"tags":["User Following"],"operationId":"unFollowing","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"400":{"description":"Bad Request","content":{"application/json":{"examples":{"언 팔로잉 실패 - 팔로잉 하지 않은 유저 언팔로잉":{"description":"언 팔로잉 실패 - 팔로잉 하지 않은 유저 언팔로잉","value":{"message":"팔로잉 정보가 없습니다."}}}}}},"200":{"description":"OK","content":{"application/json":{"examples":{"유저 언 팔로잉 성공":{"description":"유저 언 팔로잉 성공","value":{"userId":1,"name":"이름","bio":"bio","profileImageUrl":"https://example.com/abc.jpg"}}}}}}}}},"/api/v1/admins/users/{userId}":{"delete":{"tags":["관리자 유저 관리 api"],"summary":"유저 완전 삭제","description":"유저를 데이터베이스에서 완전히 삭제합니다.","operationId":"deleteUser","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"삭제한 개수를 반환합니다","content":{"application/json":{"examples":{"삭제 성공":{"description":"삭제 성공"}}}}}}}},"/api/v1/admins/posts":{"delete":{"tags":["관리자 게시물 관리 api"],"summary":"해시태그된 게시물 삭제","description":"해당 해시태그를 가진 게시물을 삭제합니다.","operationId":"deleteAllHashtaggedPost","parameters":[{"name":"hasHashtag","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"삭제한 개수를 반환합니다","content":{"application/json":{"examples":{"회원가입 성공":{"description":"회원가입 성공","value":{"count":"1"}}}}}}}}}},"components":{"schemas":{"UserUpdateDto":{"type":"object","properties":{"name":{"type":"string","description":"사용자 새 이름","example":"newOne"},"bio":{"type":"string","description":"사용자 새 자기소개","example":"Bye"},"avatarImageUrl":{"type":"string","description":"사용자 새 프로필 ","example":"https://img.icons8.com/color-pixels/32/duck.png"},"isLocked":{"type":"boolean","description":"사용자 새 잠금상태","example":true},"isPrivate":{"type":"boolean","description":"사용자 새 공개여부","example":true}},"description":"사용자 수정 "},"이메일 인증코드 Dto":{"required":["email"],"type":"object","properties":{"email":{"type":"string","description":"이메일","example":"quacker2025@gmail.com"},"code":{"type":"string","description":"인증코드","example":"<<UUID>>"}},"description":"이메일 인증코드를 전달합니다."},"UserResetPasswordDto":{"required":["email"],"type":"object","properties":{"email":{"type":"string"},"newPassword":{"pattern":"(?=.*\\p{Ll})(?=.*\\p{Lu})(?=.*\\p{Nd})(?=.*[!@#$%^&*(),.?\":{}|<>])[\\p{L}\\p{Nd}!@#$%^&*(),.?\":{}|<>]{8,16}","type":"string"},"newConfirmPassword":{"pattern":"(?=.*\\p{Ll})(?=.*\\p{Lu})(?=.*\\p{Nd})(?=.*[!@#$%^&*(),.?\":{}|<>])[\\p{L}\\p{Nd}!@#$%^&*(),.?\":{}|<>]{8,16}","type":"string"},"code":{"type":"string"}}},"FollowRequestDto":{"required":["followingUserId"],"type":"object","properties":{"followingUserId":{"type":"integer","format":"int64"}}},"PostCreateRequestDto":{"type":"object","properties":{"text":{"type":"string","description":"게시글 본문","example":"안녕하세요, 첫 글입니다."},"images":{"type":"string","format":"binary"}}},"Comment":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"text":{"type":"string"},"post":{"$ref":"#/components/schemas/Post"},"user":{"$ref":"#/components/schemas/User"}}},"Hashtag":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"postCount":{"type":"integer","format":"int32"},"hashtagPosts":{"type":"array","items":{"$ref":"#/components/schemas/HashtagPost"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"HashtagPost":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"post":{"$ref":"#/components/schemas/Post"},"hashtag":{"$ref":"#/components/schemas/Hashtag"},"createdAt":{"type":"string","format":"date-time"}}},"Post":{"type":"object","properties":{"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"id":{"type":"integer","format":"int64"},"text":{"type":"string"},"user":{"$ref":"#/components/schemas/User"},"likeCount":{"type":"integer","format":"int32"},"repostCount":{"type":"integer","format":"int32"},"originPost":{"$ref":"#/components/schemas/Post"},"version":{"type":"integer","format":"int64"},"hashtagPosts":{"type":"array","items":{"$ref":"#/components/schemas/HashtagPost"}},"comments":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"postImages":{"type":"array","items":{"$ref":"#/components/schemas/PostImage"}},"postMentions":{"type":"array","items":{"$ref":"#/components/schemas/PostMention"}},"likes":{"type":"array","items":{"$ref":"#/components/schemas/PostLike"}}}},"PostDto":{"type":"object","properties":{"id":{"type":"integer","description":"게시글 ID","format":"int64","example":1},"text":{"type":"string","description":"게시글 본문 내용","example":"오늘도 개발 중"},"likeCount":{"type":"integer","description":"좋아요 수","format":"int32","example":15},"repostCount":{"type":"integer","description":"리트윗 수","format":"int32","example":3},"user":{"$ref":"#/components/schemas/UserDto"},"originPost":{"$ref":"#/components/schemas/PostDto"},"images":{"type":"array","description":"게시글에 포함된 이미지 목록","items":{"$ref":"#/components/schemas/PostImageDto"}}}},"PostImage":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"imageUrl":{"type":"string"},"post":{"$ref":"#/components/schemas/Post"}}},"PostImageDto":{"type":"object","properties":{"id":{"type":"integer","description":"이미지 ID","format":"int64","example":1},"imageUrl":{"type":"string","description":"S3에 저장된 이미지 URL","example":"https://s3.amazonaws.com/your-bucket/image.jpg"}},"description":"게시글에 포함된 이미지 목록"},"PostLike":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"post":{"$ref":"#/components/schemas/Post"},"user":{"$ref":"#/components/schemas/User"},"createdAt":{"type":"string","format":"date-time"}}},"PostMention":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"post":{"$ref":"#/components/schemas/Post"},"user":{"$ref":"#/components/schemas/User"}}},"User":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"email":{"type":"string"},"password":{"type":"string"},"name":{"type":"string"},"bio":{"type":"string"},"avatarImageUrl":{"type":"string"},"hint":{"type":"string"},"deletedAt":{"type":"string","format":"date-time"},"posts":{"type":"array","items":{"$ref":"#/components/schemas/Post"}},"comments":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"postMentions":{"type":"array","items":{"$ref":"#/components/schemas/PostMention"}},"userFollowings":{"type":"array","items":{"$ref":"#/components/schemas/UserFollowing"}},"userFollowers":{"type":"array","items":{"$ref":"#/components/schemas/UserFollowing"}},"likes":{"type":"array","items":{"$ref":"#/components/schemas/PostLike"}},"private":{"type":"boolean"},"locked":{"type":"boolean"},"verified":{"type":"boolean"}}},"UserDto":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"email":{"type":"string"},"name":{"type":"string"},"bio":{"type":"string"},"avatarImageUrl":{"type":"string"},"isVerified":{"type":"boolean"},"isLocked":{"type":"boolean"},"isPrivate":{"type":"boolean"},"posts":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}},"description":"작성자 정보"},"UserFollowing":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"followingUser":{"$ref":"#/components/schemas/User"},"followerUser":{"$ref":"#/components/schemas/User"}}},"PostLikeResponse":{"type":"object","properties":{"isLiked":{"type":"boolean"},"likeCount":{"type":"integer","format":"int32"}}},"CommentCreateRequest":{"type":"object","properties":{"text":{"type":"string","description":"댓글 내용","example":"좋은 글 감사합니다!"}}},"이메일 Dto":{"required":["email"],"type":"object","properties":{"email":{"type":"string","description":"이메일","example":"quacker2025@gmail.com"}},"description":"이메일을 전달합니다."},"UserLoginDto":{"required":["email"],"type":"object","properties":{"email":{"type":"string","description":"사용자 이메일","example":"quacker2025@gamil.com"},"password":{"pattern":"(?=.*\\p{Ll})(?=.*\\p{Lu})(?=.*\\p{Nd})(?=.*[!@#$%^&*(),.?\":{}|<>])[\\p{L}\\p{Nd}!@#$%^&*(),.?\":{}|<>]{8,16}","type":"string","description":"사용자 비밀번호","example":"passworD!123"},"isAutoLogin":{"type":"boolean","description":"자동로그인 여부","example":true}},"description":"사용자 로그인 Dto"},"UserCreateDto":{"required":["email"],"type":"object","properties":{"email":{"type":"string","description":"사용자 이메일","example":"quacker2025@gamil.com"},"password":{"pattern":"(?=.*\\p{Ll})(?=.*\\p{Lu})(?=.*\\p{Nd})(?=.*[!@#$%^&*(),.?\":{}|<>])[\\p{L}\\p{Nd}!@#$%^&*(),.?\":{}|<>]{8,16}","type":"string","description":"사용자 비밀번호","example":"passworD!123"},"confirmPassword":{"pattern":"(?=.*\\p{Ll})(?=.*\\p{Lu})(?=.*\\p{Nd})(?=.*[!@#$%^&*(),.?\":{}|<>])[\\p{L}\\p{Nd}!@#$%^&*(),.?\":{}|<>]{8,16}","type":"string","description":"사용자 확인비밀번호","example":"passworD!123"},"name":{"pattern":"^[\\p{L}0-9]{2,16}$","type":"string","description":"사용자 이름","example":"Username"},"bio":{"type":"string","description":"사용자 자기소개","example":"Hello world!"},"avatarImageUrl":{"type":"string","description":"사용자 프로필사진","example":"https://img.icons8.com/color-pixels/32/duck.png"},"hint":{"type":"string","description":"사용자 이메일 찾기 힌트","example":"hint"},"isPrivate":{"type":"boolean","description":"사용자 비공개 여부","example":false}},"description":"사용자 회원가입 Dto"},"AdminLoginDto":{"type":"object","properties":{"username":{"type":"string","description":"관리자 이름(식별자)","example":"adminName"},"password":{"type":"string","description":"관리자 비밀번호","example":"password"}},"description":"관리자 로그인 Dto"},"AdminCreateDto":{"type":"object","properties":{"username":{"type":"string","description":"관리자 이름(식별자)","example":"adminName"},"password":{"type":"string","description":"관리자 비밀번호","example":"password"},"confirmPassword":{"type":"string","description":"관리자 확인비밀번호","example":"password"},"code":{"type":"string","description":"관리자 생성코드","example":"<<설정코드>>"}},"description":"관리자 생성 Dto"},"PostUpdateRequestDto":{"type":"object","properties":{"text":{"type":"string","description":"수정할 게시글 텍스트","example":"내용을 조금 고쳤습니다."},"newImages":{"type":"string","format":"binary"},"deleteImageIds":{"type":"array","description":"삭제할 이미지 ID 목록","example":[101,102],"items":{"type":"integer","description":"삭제할 이미지 ID 목록","format":"int64"}}},"description":"수정할 게시글 데이터 (본문, 이미지)"},"Pageable":{"type":"object","properties":{"page":{"minimum":0,"type":"integer","format":"int32"},"size":{"minimum":1,"type":"integer","format":"int32"},"sort":{"type":"array","items":{"type":"string"}}}},"힌트 Dto":{"type":"object","properties":{"hint":{"type":"string","description":"힌트 문자열","example":"hint"}},"description":"힌트를 전달합니다."}},"securitySchemes":{"bearerAuth":{"type":"http","name":"Authorization","in":"header","scheme":"bearer","bearerFormat":"JWT"}}}}