1- import { Controller , Get , Put , Delete , Route , Tags , Path , Body , Query , SuccessResponse , Response } from 'tsoa' ;
1+ import {
2+ Controller ,
3+ Get ,
4+ Put ,
5+ Delete ,
6+ Route ,
7+ Tags ,
8+ Path ,
9+ Body ,
10+ Query ,
11+ SuccessResponse ,
12+ Response ,
13+ Security ,
14+ Request ,
15+ } from 'tsoa' ;
16+ import { Request as ExpressRequest } from 'express' ;
217import ReviewService from '../service/review_service' ;
3- import { ReviewResponseDto , ReviewListResponseDto , UpdateReviewRequestDto } from '../DTO/review_dto' ;
18+ import {
19+ ReviewResponseDto ,
20+ ReviewListResponseDto ,
21+ UpdateReviewRequestDto ,
22+ } from '../DTO/review_dto' ;
423import { TsoaSuccessResponse } from '../config/response_interface' ;
24+ import { uuidToBuffer } from '../util/uuid_util' ;
525
626/**
727 * Review Controller
@@ -12,19 +32,22 @@ import { TsoaSuccessResponse } from '../config/response_interface';
1232export class ReviewController extends Controller {
1333 /**
1434 * 내 리뷰 목록 조회
15- * @param userId - 사용자 ID (UUID 문자열 )
35+ * @param req Express Request (JWT에서 userId 추출 )
1636 * @param sort - 정렬 방식 ('latest' = 최신순, 'oldest' = 오래된순)
1737 * @returns 리뷰 목록
1838 */
19- @Get ( '{userId}/reviews' )
39+ @Get ( 'me/reviews' )
40+ @Security ( 'jwt' )
2041 @SuccessResponse ( '200' , '리뷰 목록 조회 성공' )
42+ @Response ( 401 , 'Unauthorized' )
2143 @Response ( 404 , 'User Not Found' )
2244 @Response ( 500 , 'Internal Server Error' )
2345 public async getMyReviews (
24- @Path ( ) userId : string ,
46+ @Request ( ) req : ExpressRequest ,
2547 @Query ( ) sort : 'latest' | 'oldest' = 'latest' ,
2648 ) : Promise < TsoaSuccessResponse < ReviewListResponseDto > > {
27- const userIdBuffer = this . uuidToBuffer ( userId ) ;
49+ const userId = ( req . user as unknown as { id : string } ) . id ;
50+ const userIdBuffer = uuidToBuffer ( userId ) ;
2851 const orderBy = sort === 'latest' ? 'desc' : 'asc' ;
2952
3053 const reviews = await ReviewService . getReviewsByUserId ( userIdBuffer , orderBy ) ;
@@ -34,24 +57,27 @@ export class ReviewController extends Controller {
3457
3558 /**
3659 * 리뷰 수정
37- * @param userId - 사용자 ID (UUID 문자열 )
60+ * @param req Express Request (JWT에서 userId 추출 )
3861 * @param reviewId - 리뷰 ID (UUID 문자열)
3962 * @param requestBody - 수정할 리뷰 데이터
4063 * @returns 수정된 리뷰 정보
4164 */
42- @Put ( '{userId}/reviews/{reviewId}' )
65+ @Put ( 'me/reviews/{reviewId}' )
66+ @Security ( 'jwt' )
4367 @SuccessResponse ( '200' , '리뷰 수정 성공' )
4468 @Response ( 400 , 'Bad Request' )
69+ @Response ( 401 , 'Unauthorized' )
4570 @Response ( 403 , 'Forbidden - 본인의 리뷰만 수정 가능' )
4671 @Response ( 404 , 'Review Not Found' )
4772 @Response ( 500 , 'Internal Server Error' )
4873 public async updateReview (
49- @Path ( ) userId : string ,
74+ @Request ( ) req : ExpressRequest ,
5075 @Path ( ) reviewId : string ,
5176 @Body ( ) requestBody : UpdateReviewRequestDto ,
5277 ) : Promise < TsoaSuccessResponse < ReviewResponseDto > > {
53- const userIdBuffer = this . uuidToBuffer ( userId ) ;
54- const reviewIdBuffer = this . uuidToBuffer ( reviewId ) ;
78+ const userId = ( req . user as unknown as { id : string } ) . id ;
79+ const userIdBuffer = uuidToBuffer ( userId ) ;
80+ const reviewIdBuffer = uuidToBuffer ( reviewId ) ;
5581
5682 const review = await ReviewService . updateReview ( reviewIdBuffer , userIdBuffer , requestBody ) ;
5783
@@ -60,33 +86,26 @@ export class ReviewController extends Controller {
6086
6187 /**
6288 * 리뷰 삭제
63- * @param userId - 사용자 ID (UUID 문자열 )
89+ * @param req Express Request (JWT에서 userId 추출 )
6490 * @param reviewId - 리뷰 ID (UUID 문자열)
6591 */
66- @Delete ( '{userId}/reviews/{reviewId}' )
92+ @Delete ( 'me/reviews/{reviewId}' )
93+ @Security ( 'jwt' )
6794 @SuccessResponse ( '200' , '리뷰 삭제 성공' )
95+ @Response ( 401 , 'Unauthorized' )
6896 @Response ( 403 , 'Forbidden - 본인의 리뷰만 삭제 가능' )
6997 @Response ( 404 , 'Review Not Found' )
7098 @Response ( 500 , 'Internal Server Error' )
7199 public async deleteReview (
72- @Path ( ) userId : string ,
100+ @Request ( ) req : ExpressRequest ,
73101 @Path ( ) reviewId : string ,
74102 ) : Promise < TsoaSuccessResponse < { message : string } > > {
75- const userIdBuffer = this . uuidToBuffer ( userId ) ;
76- const reviewIdBuffer = this . uuidToBuffer ( reviewId ) ;
103+ const userId = ( req . user as unknown as { id : string } ) . id ;
104+ const userIdBuffer = uuidToBuffer ( userId ) ;
105+ const reviewIdBuffer = uuidToBuffer ( reviewId ) ;
77106
78107 await ReviewService . deleteReview ( reviewIdBuffer , userIdBuffer ) ;
79108
80109 return new TsoaSuccessResponse ( { message : '리뷰가 삭제되었습니다.' } ) ;
81110 }
82-
83- /**
84- * UUID 문자열을 Uint8Array로 변환
85- * @param uuid - UUID 문자열 (예: "550e8400-e29b-41d4-a716-446655440000")
86- * @returns Uint8Array
87- */
88- private uuidToBuffer ( uuid : string ) : Uint8Array {
89- const hex = uuid . replace ( / - / g, '' ) ;
90- return Buffer . from ( hex , 'hex' ) ;
91- }
92111}
0 commit comments