From 7867b1ee84fa26a0f33e2787dc8545f03789e621 Mon Sep 17 00:00:00 2001 From: GoGradually Date: Wed, 31 Dec 2025 17:12:43 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=ED=91=B8=EC=8B=9C=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20API=20=EB=B2=84=EC=A0=84=200=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PushNotificationControllerV0.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java diff --git a/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java b/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java new file mode 100644 index 0000000..fa18b23 --- /dev/null +++ b/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java @@ -0,0 +1,69 @@ +package me.pinitnotification.interfaces.notification; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import me.pinitnotification.application.push.PushService; +import me.pinitnotification.domain.member.MemberId; +import me.pinitnotification.interfaces.notification.dto.PushTokenRequest; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/v0/push") +@Tag(name = "푸시 알림", description = "푸시 구독 및 VAPID 키 관련 API") +public class PushNotificationControllerV0 { + private final PushService pushService; + + public PushNotificationControllerV0(PushService pushService) { + this.pushService = pushService; + } + + @GetMapping("/vapid") + @Operation( + summary = "VAPID 공개키 조회", + description = "웹 푸시 구독에 사용되는 VAPID 공개키를 반환합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "VAPID 공개키", + content = @Content(mediaType = "text/plain", schema = @Schema(implementation = String.class))) + }) + public String getVapidPublicKey() { + return pushService.getVapidPublicKey(); + } + + @PostMapping("/subscribe") + @Operation( + summary = "푸시 토큰 구독 등록", + description = "인증된 회원의 푸시 토큰을 등록합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "구독 등록 완료"), + @ApiResponse(responseCode = "400", description = "토큰이 유효하지 않음", content = @Content) + }) + public void subscribe( + @Parameter(hidden = true) @MemberId Long memberId, + @RequestBody PushTokenRequest request) { + pushService.subscribe(memberId, request.token()); + } + + @PostMapping("/unsubscribe") + @Operation( + summary = "푸시 토큰 구독 해지", + description = "인증된 회원의 등록된 푸시 토큰을 삭제합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "구독 해지 완료"), + @ApiResponse(responseCode = "400", description = "토큰이 유효하지 않음", content = @Content) + }) + public void unsubscribe( + @Parameter(hidden = true) @MemberId Long memberId, + @RequestBody PushTokenRequest request) { + pushService.unsubscribe(memberId, request.token()); + } + + +} From 743852d22ac657525eec6be73d274099ab06100a Mon Sep 17 00:00:00 2001 From: GoGradually Date: Wed, 31 Dec 2025 17:43:59 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=ED=91=B8=EC=8B=9C=20=EA=B5=AC?= =?UTF-8?q?=EB=8F=85=20=EC=83=81=ED=83=9C=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B5=AC?= =?UTF-8?q?=EB=8F=85=20=EB=93=B1=EB=A1=9D/=ED=95=B4=EC=A0=9C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PushNotificationControllerV0.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java b/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java index fa18b23..ecd8943 100644 --- a/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java +++ b/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationControllerV0.java @@ -35,6 +35,21 @@ public String getVapidPublicKey() { return pushService.getVapidPublicKey(); } + @GetMapping("/subscribed") + @Operation( + summary = "푸시 구독 상태 조회", + description = "인증된 회원이 푸시 알림을 구독 중인지 여부를 반환합니다." + ) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "구독 상태 조회 완료", + content = @Content(mediaType = "text/plain", schema = @Schema(implementation = Boolean.class))) + }) + public boolean isSubscribed( + @Parameter(hidden = true) @MemberId Long memberId, + @RequestParam String deviceId) { + return pushService.isSubscribed(memberId, deviceId); + } + @PostMapping("/subscribe") @Operation( summary = "푸시 토큰 구독 등록", @@ -47,7 +62,7 @@ public String getVapidPublicKey() { public void subscribe( @Parameter(hidden = true) @MemberId Long memberId, @RequestBody PushTokenRequest request) { - pushService.subscribe(memberId, request.token()); + pushService.subscribe(memberId, request.deviceId(), request.token()); } @PostMapping("/unsubscribe") @@ -62,7 +77,7 @@ public void subscribe( public void unsubscribe( @Parameter(hidden = true) @MemberId Long memberId, @RequestBody PushTokenRequest request) { - pushService.unsubscribe(memberId, request.token()); + pushService.unsubscribe(memberId, request.deviceId(), request.token()); } From 8a205abb5e3578676765d2c8c3a0cdf1ab7f028a Mon Sep 17 00:00:00 2001 From: GoGradually Date: Wed, 31 Dec 2025 17:46:56 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20PushNotificationController=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20@Deprecated=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interfaces/notification/PushNotificationController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationController.java b/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationController.java index a383d4e..3f54f1d 100644 --- a/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationController.java +++ b/src/main/java/me/pinitnotification/interfaces/notification/PushNotificationController.java @@ -12,6 +12,7 @@ import me.pinitnotification.interfaces.notification.dto.PushTokenRequest; import org.springframework.web.bind.annotation.*; +@Deprecated @RestController @RequestMapping("/push") @Tag(name = "푸시 알림", description = "푸시 구독 및 VAPID 키 관련 API")