From 1012a665602b01bffa032458c5710c1aa3568041 Mon Sep 17 00:00:00 2001 From: paisano55 Date: Sun, 12 Oct 2025 01:37:13 +0900 Subject: [PATCH 1/6] [Redesign/Review] add review liked patch api / not tested --- .../src/common/interfaces/v2/IReviewV2.ts | 13 +++++++ .../reviews/v2/reviews.v2.controller.ts | 14 +++++++- .../modules/reviews/v2/reviews.v2.service.ts | 34 +++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/apps/server/src/common/interfaces/v2/IReviewV2.ts b/apps/server/src/common/interfaces/v2/IReviewV2.ts index 06871d5c..0a1ec2a4 100644 --- a/apps/server/src/common/interfaces/v2/IReviewV2.ts +++ b/apps/server/src/common/interfaces/v2/IReviewV2.ts @@ -121,4 +121,17 @@ export namespace IReviewV2 { @ApiProperty({ type: Number }) id!: number } + + export class PatchLikedDto { + @ApiProperty() + @IsNumber() + @IsNotEmpty() + reviewId!: number + + @ApiProperty({ enum: ['like', 'unlike'] }) + @IsString() + @IsNotEmpty() + @IsIn(['like', 'unlike']) + action!: 'like' | 'unlike' + } } diff --git a/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts b/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts index 2eb5685c..3aa7e8a9 100644 --- a/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts +++ b/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts @@ -1,5 +1,5 @@ import { - Body, Controller, Get, HttpException, HttpStatus, Post, Query, Req, + Body, Controller, Get, HttpException, HttpStatus, Param, Patch, Post, Query, Req, } from '@nestjs/common' import { GetLanguage } from '@otl/server-nest/common/decorators/get-language.decorator' import { GetUser } from '@otl/server-nest/common/decorators/get-user.decorator' @@ -48,4 +48,16 @@ export class ReviewsV2Controller { const result = await this.reviewsV2Service.createReviewV2(reviewBody, user) return { id: result.id } } + + @Patch('/:reviewId/liked') + async patchReviewLike( + @Param('reviewId') reviewId: number, + @Body() body: IReviewV2.PatchLikedDto, + @GetUser() user: session_userprofile, + ): Promise { + if (reviewId !== body.reviewId) { + throw new HttpException('Path param and body id not match', HttpStatus.BAD_REQUEST) + } + return await this.reviewsV2Service.updateReviewLiked(body, user) + } } diff --git a/apps/server/src/modules/reviews/v2/reviews.v2.service.ts b/apps/server/src/modules/reviews/v2/reviews.v2.service.ts index 8e067fe5..6c51ae90 100644 --- a/apps/server/src/modules/reviews/v2/reviews.v2.service.ts +++ b/apps/server/src/modules/reviews/v2/reviews.v2.service.ts @@ -237,4 +237,38 @@ export class ReviewsV2Service { return review } + + @Transactional() + async updateReviewLiked(body: IReviewV2.PatchLikedDto, user: session_userprofile): Promise { + const review = await this.reviewsRepository.getReviewById(body.reviewId) + if (!review) { + throw new HttpException('Can\'t find review', HttpStatus.BAD_REQUEST) + } + + const alreadyLiked = await this.reviewsRepository.isLiked(body.reviewId, user.id) + + // todo: 중복 요청 오류 처리할지 말지 + switch (body.action) { + case 'like': + if (alreadyLiked) { + throw new HttpException('Requested for like, but already liked', HttpStatus.BAD_REQUEST) + } + await this.reviewsRepository.upsertReviewVote(body.reviewId, user.id) + break + case 'unlike': + if (!alreadyLiked) { + throw new HttpException('Requested for unlike, but not liked yet', HttpStatus.BAD_REQUEST) + } + await this.reviewsRepository.deleteReviewVote(body.reviewId, user.id) + break + default: + throw new HttpException(`Invalid action: ${body.action}`, HttpStatus.BAD_REQUEST) + } + + await this.reviewMQ.publishReviewLikeUpdate(body.reviewId).catch((e) => { + logger.error(`Error while publishing review like update: ${e.message}`, e) + }) + + return 0 + } } From 76f0bf6cac19ca18dd77d1d5d3dfd587547c447f Mon Sep 17 00:00:00 2001 From: paisano55 Date: Mon, 3 Nov 2025 20:42:48 +0900 Subject: [PATCH 2/6] [Redesign/Review] add review put api --- .../src/common/interfaces/v2/IReviewV2.ts | 34 +++++++++++++++++ .../reviews/v2/reviews.v2.controller.ts | 15 +++++++- .../modules/reviews/v2/reviews.v2.service.ts | 38 +++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/apps/server/src/common/interfaces/v2/IReviewV2.ts b/apps/server/src/common/interfaces/v2/IReviewV2.ts index 0a1ec2a4..75f55ef3 100644 --- a/apps/server/src/common/interfaces/v2/IReviewV2.ts +++ b/apps/server/src/common/interfaces/v2/IReviewV2.ts @@ -122,6 +122,40 @@ export namespace IReviewV2 { id!: number } + export class UpdateDto { + @ApiProperty() + @IsString() + @IsNotEmpty() + @Validate(StringStripLength) + content!: string + + @ApiProperty() + @IsNumber() + @Min(0) + @Max(5) + @Type(() => Number) + grade!: number + + @ApiProperty() + @IsNumber() + @Min(0) + @Max(5) + @Type(() => Number) + load!: number + + @ApiProperty() + @IsNumber() + @Min(0) + @Max(5) + @Type(() => Number) + speech!: number + } + + export class UpdateResponseDto { + @ApiProperty({ type: Number }) + id!: number + } + export class PatchLikedDto { @ApiProperty() @IsNumber() diff --git a/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts b/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts index 3aa7e8a9..5a2ddc5a 100644 --- a/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts +++ b/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts @@ -1,5 +1,5 @@ import { - Body, Controller, Get, HttpException, HttpStatus, Param, Patch, Post, Query, Req, + Body, Controller, Get, HttpException, HttpStatus, Param, Patch, Post, Put, Query, Req, } from '@nestjs/common' import { GetLanguage } from '@otl/server-nest/common/decorators/get-language.decorator' import { GetUser } from '@otl/server-nest/common/decorators/get-user.decorator' @@ -49,6 +49,19 @@ export class ReviewsV2Controller { return { id: result.id } } + @Put(':reviewId') + async updateReviewV2( + @Param('reviewId') reviewId: number, + @Body() reviewBody: IReviewV2.UpdateDto, + @GetUser() user: session_userprofile, + ): Promise { + if (!user) { + throw new HttpException('Unauthorized', HttpStatus.UNAUTHORIZED) + } + + return await this.reviewsV2Service.updateReviewV2(reviewId, reviewBody, user) + } + @Patch('/:reviewId/liked') async patchReviewLike( @Param('reviewId') reviewId: number, diff --git a/apps/server/src/modules/reviews/v2/reviews.v2.service.ts b/apps/server/src/modules/reviews/v2/reviews.v2.service.ts index 6c51ae90..8abcc1c6 100644 --- a/apps/server/src/modules/reviews/v2/reviews.v2.service.ts +++ b/apps/server/src/modules/reviews/v2/reviews.v2.service.ts @@ -238,6 +238,44 @@ export class ReviewsV2Service { return review } + @Transactional() + async updateReviewV2( + reviewId: number, + reviewBody: IReviewV2.UpdateDto, + user: session_userprofile, + ): Promise { + const review = await this.reviewsRepository.getReviewById(reviewId) + if (!review) { + throw new HttpException('Review not found', HttpStatus.NOT_FOUND) + } + + if (review.writer_id !== user.id) { + throw new HttpException('Current user id is not matched with review writer id', HttpStatus.BAD_REQUEST) + } + + if (review.is_deleted) { + throw new HttpException('Target review deleted by admin', HttpStatus.BAD_REQUEST) + } + + const updatedReview = await this.reviewsRepository.updateReview( + review.id, + reviewBody.content, + reviewBody.grade, + reviewBody.load, + reviewBody.speech, + ) + + await Promise.all([ + this.reviewMQ.publishCourseScoreUpdate(updatedReview.course_id), + this.reviewMQ.publishLectureScoreUpdate(updatedReview.lecture_id), + ...updatedReview.lecture.subject_lecture_professors.map((professor) => this.reviewMQ.publishProfessorScoreUpdate(professor.id)), + ]).catch((e) => { + logger.error(`Error while publishing review score update: ${e.message}`, e) + }) + + return { id: updatedReview.id } + } + @Transactional() async updateReviewLiked(body: IReviewV2.PatchLikedDto, user: session_userprofile): Promise { const review = await this.reviewsRepository.getReviewById(body.reviewId) From 62bb3e2dc577820817ee5708d8c1807336fff066 Mon Sep 17 00:00:00 2001 From: paisano55 Date: Mon, 3 Nov 2025 02:06:52 +0900 Subject: [PATCH 3/6] [Redesign/Review] clean code / change review like response type / update swagger --- .../server/src/modules/reviews/v2/reviews.v2.controller.ts | 4 ++-- apps/server/src/modules/reviews/v2/reviews.v2.service.ts | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts b/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts index 5a2ddc5a..461c83db 100644 --- a/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts +++ b/apps/server/src/modules/reviews/v2/reviews.v2.controller.ts @@ -49,7 +49,7 @@ export class ReviewsV2Controller { return { id: result.id } } - @Put(':reviewId') + @Put('/:reviewId') async updateReviewV2( @Param('reviewId') reviewId: number, @Body() reviewBody: IReviewV2.UpdateDto, @@ -67,7 +67,7 @@ export class ReviewsV2Controller { @Param('reviewId') reviewId: number, @Body() body: IReviewV2.PatchLikedDto, @GetUser() user: session_userprofile, - ): Promise { + ): Promise { if (reviewId !== body.reviewId) { throw new HttpException('Path param and body id not match', HttpStatus.BAD_REQUEST) } diff --git a/apps/server/src/modules/reviews/v2/reviews.v2.service.ts b/apps/server/src/modules/reviews/v2/reviews.v2.service.ts index 8abcc1c6..2c68688d 100644 --- a/apps/server/src/modules/reviews/v2/reviews.v2.service.ts +++ b/apps/server/src/modules/reviews/v2/reviews.v2.service.ts @@ -277,7 +277,10 @@ export class ReviewsV2Service { } @Transactional() - async updateReviewLiked(body: IReviewV2.PatchLikedDto, user: session_userprofile): Promise { + async updateReviewLiked( + body: IReviewV2.PatchLikedDto, + user: session_userprofile, + ): Promise { const review = await this.reviewsRepository.getReviewById(body.reviewId) if (!review) { throw new HttpException('Can\'t find review', HttpStatus.BAD_REQUEST) @@ -307,6 +310,6 @@ export class ReviewsV2Service { logger.error(`Error while publishing review like update: ${e.message}`, e) }) - return 0 + return { id: body.reviewId } } } From 089abfcdcd24cd587ea59de6ae913d8950ed26e2 Mon Sep 17 00:00:00 2001 From: paisano55 Date: Mon, 3 Nov 2025 20:45:54 +0900 Subject: [PATCH 4/6] [Redesign/Review] update swagger --- apps/server/docs/swagger.json | 137 ++++++++++++++++++++++++++++++---- apps/server/src/swagger.json | 137 ++++++++++++++++++++++++++++++---- 2 files changed, 248 insertions(+), 26 deletions(-) diff --git a/apps/server/docs/swagger.json b/apps/server/docs/swagger.json index a93bb0e6..eb8decde 100644 --- a/apps/server/docs/swagger.json +++ b/apps/server/docs/swagger.json @@ -918,7 +918,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").NotificationRequest" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").NotificationRequest" } } } @@ -936,7 +936,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").FCMNotificationRequest" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").FCMNotificationRequest" } } } @@ -963,7 +963,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").UserNotification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").UserNotification" } } } @@ -992,7 +992,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/agreement/domain/UserAgreement\").Agreement" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/agreement/domain/UserAgreement\").Agreement" } } } @@ -1010,7 +1010,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } } } @@ -1035,7 +1035,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } } } @@ -1087,7 +1087,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } } } @@ -1110,7 +1110,7 @@ "type": "null" }, { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } ] } @@ -2660,6 +2660,80 @@ } } }, + "/api/v2/reviews/{reviewId}": { + "put": { + "summary": "ReviewsV2Controller.updateReviewV2", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.UpdateResponseDto" + } + } + } + } + }, + "parameters": [ + { + "name": "reviewId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.UpdateDto" + } + } + } + } + } + }, + "/api/v2/reviews/{reviewId}/liked": { + "patch": { + "summary": "ReviewsV2Controller.patchReviewLike", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.UpdateResponseDto" + } + } + } + } + }, + "parameters": [ + { + "name": "reviewId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.PatchLikedDto" + } + } + } + } + } + }, "/api/v2/timetables": { "get": { "summary": "TimetablesControllerV2.getTimetables", @@ -6240,9 +6314,6 @@ "direction": { "type": "string", "enum": ["ltr", "rtl"] - }, - "lang": { - "type": "string" } }, "required": [ @@ -6269,8 +6340,7 @@ "textBaseline", "textAlign", "canvas", - "direction", - "lang" + "direction" ], "additionalProperties": false }, @@ -7702,6 +7772,47 @@ "required": ["lectureId", "content", "grade", "load", "speech"] }, "IReviewV2.CreateResponseDto": {}, + "IReviewV2.UpdateDto": { + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "grade": { + "maximum": 5, + "type": "number", + "minimum": 0 + }, + "load": { + "maximum": 5, + "type": "number", + "minimum": 0 + }, + "speech": { + "maximum": 5, + "type": "number", + "minimum": 0 + } + }, + "type": "object", + "required": ["content", "grade", "load", "speech"] + }, + "IReviewV2.UpdateResponseDto": {}, + "IReviewV2.PatchLikedDto": { + "properties": { + "reviewId": { + "minLength": 1, + "type": "number" + }, + "action": { + "type": "string", + "enum": ["like", "unlike"], + "minLength": 1 + } + }, + "type": "object", + "required": ["reviewId", "action"] + }, "ITimetableV2.GetListQueryDto": { "properties": { "user_id": { diff --git a/apps/server/src/swagger.json b/apps/server/src/swagger.json index a93bb0e6..eb8decde 100644 --- a/apps/server/src/swagger.json +++ b/apps/server/src/swagger.json @@ -918,7 +918,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").NotificationRequest" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").NotificationRequest" } } } @@ -936,7 +936,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").FCMNotificationRequest" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").FCMNotificationRequest" } } } @@ -963,7 +963,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").UserNotification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").UserNotification" } } } @@ -992,7 +992,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/agreement/domain/UserAgreement\").Agreement" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/agreement/domain/UserAgreement\").Agreement" } } } @@ -1010,7 +1010,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } } } @@ -1035,7 +1035,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } } } @@ -1087,7 +1087,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } } } @@ -1110,7 +1110,7 @@ "type": "null" }, { - "$ref": "#/components/schemas/import(\"/Users/sciberbee/Documents/otl/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" + "$ref": "#/components/schemas/import(\"/Users/panda/Desktop/develop/sparcs/otlplus-server/apps/server/src/modules/notification/domain/notification\").Notification" } ] } @@ -2660,6 +2660,80 @@ } } }, + "/api/v2/reviews/{reviewId}": { + "put": { + "summary": "ReviewsV2Controller.updateReviewV2", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.UpdateResponseDto" + } + } + } + } + }, + "parameters": [ + { + "name": "reviewId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.UpdateDto" + } + } + } + } + } + }, + "/api/v2/reviews/{reviewId}/liked": { + "patch": { + "summary": "ReviewsV2Controller.patchReviewLike", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.UpdateResponseDto" + } + } + } + } + }, + "parameters": [ + { + "name": "reviewId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IReviewV2.PatchLikedDto" + } + } + } + } + } + }, "/api/v2/timetables": { "get": { "summary": "TimetablesControllerV2.getTimetables", @@ -6240,9 +6314,6 @@ "direction": { "type": "string", "enum": ["ltr", "rtl"] - }, - "lang": { - "type": "string" } }, "required": [ @@ -6269,8 +6340,7 @@ "textBaseline", "textAlign", "canvas", - "direction", - "lang" + "direction" ], "additionalProperties": false }, @@ -7702,6 +7772,47 @@ "required": ["lectureId", "content", "grade", "load", "speech"] }, "IReviewV2.CreateResponseDto": {}, + "IReviewV2.UpdateDto": { + "properties": { + "content": { + "minLength": 1, + "type": "string" + }, + "grade": { + "maximum": 5, + "type": "number", + "minimum": 0 + }, + "load": { + "maximum": 5, + "type": "number", + "minimum": 0 + }, + "speech": { + "maximum": 5, + "type": "number", + "minimum": 0 + } + }, + "type": "object", + "required": ["content", "grade", "load", "speech"] + }, + "IReviewV2.UpdateResponseDto": {}, + "IReviewV2.PatchLikedDto": { + "properties": { + "reviewId": { + "minLength": 1, + "type": "number" + }, + "action": { + "type": "string", + "enum": ["like", "unlike"], + "minLength": 1 + } + }, + "type": "object", + "required": ["reviewId", "action"] + }, "ITimetableV2.GetListQueryDto": { "properties": { "user_id": { From 7f38a55681256b32ab7c73248d9ce4f201b05600 Mon Sep 17 00:00:00 2001 From: paisano55 Date: Mon, 3 Nov 2025 20:51:40 +0900 Subject: [PATCH 5/6] [Redesign/Review] update resp type / update swagger --- apps/server/docs/swagger.json | 11 ++++++++++- apps/server/src/common/interfaces/v2/IReviewV2.ts | 4 +++- apps/server/src/swagger.json | 11 ++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/server/docs/swagger.json b/apps/server/docs/swagger.json index eb8decde..a2c5b39a 100644 --- a/apps/server/docs/swagger.json +++ b/apps/server/docs/swagger.json @@ -7797,7 +7797,16 @@ "type": "object", "required": ["content", "grade", "load", "speech"] }, - "IReviewV2.UpdateResponseDto": {}, + "IReviewV2.UpdateResponseDto": { + "properties": { + "id": { + "minLength": 1, + "type": "number" + } + }, + "type": "object", + "required": ["id"] + }, "IReviewV2.PatchLikedDto": { "properties": { "reviewId": { diff --git a/apps/server/src/common/interfaces/v2/IReviewV2.ts b/apps/server/src/common/interfaces/v2/IReviewV2.ts index 75f55ef3..60038982 100644 --- a/apps/server/src/common/interfaces/v2/IReviewV2.ts +++ b/apps/server/src/common/interfaces/v2/IReviewV2.ts @@ -152,7 +152,9 @@ export namespace IReviewV2 { } export class UpdateResponseDto { - @ApiProperty({ type: Number }) + @ApiProperty() + @IsNumber() + @IsNotEmpty() id!: number } diff --git a/apps/server/src/swagger.json b/apps/server/src/swagger.json index eb8decde..a2c5b39a 100644 --- a/apps/server/src/swagger.json +++ b/apps/server/src/swagger.json @@ -7797,7 +7797,16 @@ "type": "object", "required": ["content", "grade", "load", "speech"] }, - "IReviewV2.UpdateResponseDto": {}, + "IReviewV2.UpdateResponseDto": { + "properties": { + "id": { + "minLength": 1, + "type": "number" + } + }, + "type": "object", + "required": ["id"] + }, "IReviewV2.PatchLikedDto": { "properties": { "reviewId": { From ffa3f713f3bb6bc735a9ed2f4657f26313071c65 Mon Sep 17 00:00:00 2001 From: paisano55 Date: Mon, 3 Nov 2025 21:21:03 +0900 Subject: [PATCH 6/6] [Redesign/Review] PR - IsNotEmpty check add --- apps/server/src/common/interfaces/v2/IReviewV2.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/server/src/common/interfaces/v2/IReviewV2.ts b/apps/server/src/common/interfaces/v2/IReviewV2.ts index 60038982..6b848873 100644 --- a/apps/server/src/common/interfaces/v2/IReviewV2.ts +++ b/apps/server/src/common/interfaces/v2/IReviewV2.ts @@ -131,6 +131,7 @@ export namespace IReviewV2 { @ApiProperty() @IsNumber() + @IsNotEmpty() @Min(0) @Max(5) @Type(() => Number) @@ -138,6 +139,7 @@ export namespace IReviewV2 { @ApiProperty() @IsNumber() + @IsNotEmpty() @Min(0) @Max(5) @Type(() => Number) @@ -145,6 +147,7 @@ export namespace IReviewV2 { @ApiProperty() @IsNumber() + @IsNotEmpty() @Min(0) @Max(5) @Type(() => Number)