From 2e507eb97abea91912a3a5a7fd7c638d948fe864 Mon Sep 17 00:00:00 2001 From: Pochomo Date: Thu, 13 Mar 2025 13:42:15 +0900 Subject: [PATCH 1/4] =?UTF-8?q?SocialShareController=20=EC=A7=81=EC=A0=91?= =?UTF-8?q?=20=EA=B3=B5=EC=9C=A0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/KakaoSocialShareServiceImpl.java | 9 +--- .../usecase/SocialShareService.java | 1 - .../usecase/XSocialShareServiceImpl.java | 2 +- .../example/web/SocialShareController.java | 44 ------------------- 4 files changed, 3 insertions(+), 53 deletions(-) diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java index ff81605..a2ffc46 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java @@ -1,5 +1,6 @@ package com.spoti.api.auth.domain.oauth2.socialShare.usecase; +import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; @@ -18,6 +19,7 @@ /** * 카카오톡 공유 기능 구현 클래스 */ +@Getter @Service @Primary public class KakaoSocialShareServiceImpl extends SocialShareServiceImpl { @@ -95,13 +97,6 @@ public SocialShareResponse getKakaoTemplateByContentId(Long contentId) { return response; } - /** - * API 키 getter 메서드 - */ - public String getKakaoApiKey() { - return kakaoApiKey; - } - /** * 카카오톡에 직접 공유하기 (현재 API 미지원) */ diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java index 40fffc0..3e9fe39 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java @@ -1,6 +1,5 @@ package com.spoti.api.auth.domain.oauth2.socialShare.usecase; -import java.util.Map; import com.spoti.api.auth.domain.oauth2.socialShare.dto.SocialShareResponse; /** diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java index 5ca61db..ab4c4c0 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java @@ -49,7 +49,7 @@ protected void addPlatformSpecificInfo(Map platformData, Content /** * X 공유 URL 생성 - * 프론트엔드에서 window.open()으로 열 수 있는 URL을 생성합니다. + * 프론트엔드에서 window.open()으로 열 수 있는 URL을 생성 */ public String generateXShareUrl(Long contentId, String customText) { try { diff --git a/resource-server/src/main/java/com/example/web/SocialShareController.java b/resource-server/src/main/java/com/example/web/SocialShareController.java index 29bff60..8524daf 100644 --- a/resource-server/src/main/java/com/example/web/SocialShareController.java +++ b/resource-server/src/main/java/com/example/web/SocialShareController.java @@ -236,50 +236,6 @@ public ResponseEntity trackShare( return ResponseEntity.ok().build(); } - /** - * 소셜 미디어 직접 공유 API (OAuth 인증 필요한 경우) - */ - @Operation(summary = "소셜 미디어에 직접 공유", description = "소셜 미디어 플랫폼에 컨텐츠를 직접 공유합니다 (인증 필요한 경우)") - @ApiResponses(value = { - @ApiResponse( - responseCode = "200", - description = "공유 성공", - content = @Content( - schema = @Schema(implementation = SocialShareResponse.class) - ) - ), - @ApiResponse( - responseCode = "400", - description = "잘못된 요청", - content = @Content( - schema = @Schema(implementation = ErrorResponse.class), - examples = @ExampleObject( - value = "{\"status\": 400, \"code\": \"S005\", \"message\": \"지원하지 않는 플랫폼입니다.\"}" - ) - ) - ), - @ApiResponse( - responseCode = "401", - description = "인증 오류", - content = @Content( - schema = @Schema(implementation = ErrorResponse.class), - examples = @ExampleObject( - value = "{\"status\": 401, \"code\": \"S006\", \"message\": \"인증이 필요합니다.\"}" - ) - ) - ), - @ApiResponse( - responseCode = "500", - description = "서버 오류", - content = @Content( - schema = @Schema(implementation = ErrorResponse.class), - examples = @ExampleObject( - value = "{\"status\": 500, \"code\": \"S007\", \"message\": \"공유 처리 중 오류 발생\"}" - ) - ) - ) - }) - @PostMapping("/post") public ResponseEntity postToSocialMedia( @io.swagger.v3.oas.annotations.parameters.RequestBody( From 159df944c669ca7d3f4eab84f54a9ba87e14e7d7 Mon Sep 17 00:00:00 2001 From: Pochomo Date: Thu, 13 Mar 2025 14:25:52 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EA=B3=B5=EC=9C=A0=EA=B8=B0=EB=8A=A5=20OAut?= =?UTF-8?q?h=20=EA=B4=80=EB=A0=A8=20=EB=B3=80=EC=88=98=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InstagramSocialShareServiceImpl.java | 2 +- .../usecase/KakaoSocialShareServiceImpl.java | 2 +- .../usecase/SocialShareService.java | 10 +--------- .../usecase/SocialShareServiceImpl.java | 11 +--------- .../usecase/XSocialShareServiceImpl.java | 2 +- .../example/web/SocialShareController.java | 20 +++++-------------- 6 files changed, 10 insertions(+), 37 deletions(-) diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java index f59c775..4e75853 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java @@ -121,7 +121,7 @@ public SocialShareResponse generateInstagramShareUrl(Long contentId, String cust * 인스타그램에 직접 공유하기 (현재 API 미지원) */ @Override - public SocialShareResponse shareToSocialMedia(Long contentId, String message, String authToken) { + public SocialShareResponse shareToSocialMedia(Long contentId, String message) { return SocialShareResponse.failure("인스타그램은 API를 통한 직접 공유를 지원하지 않습니다."); } } diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java index a2ffc46..f3a40c6 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java @@ -101,7 +101,7 @@ public SocialShareResponse getKakaoTemplateByContentId(Long contentId) { * 카카오톡에 직접 공유하기 (현재 API 미지원) */ @Override - public SocialShareResponse shareToSocialMedia(Long contentId, String message, String authToken) { + public SocialShareResponse shareToSocialMedia(Long contentId, String message) { return SocialShareResponse.failure("카카오톡은 SDK를 통한 클라이언트 측 공유만 지원합니다."); } } diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java index 3e9fe39..f48e46a 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareService.java @@ -23,19 +23,11 @@ public interface SocialShareService { */ void trackShare(Long contentId, String platform, Long userId); - /** - * 사용자 인증 토큰 검증 - * @param authToken 인증 토큰 - * @return 유효성 여부 - */ - boolean validateToken(String authToken); - /** * 소셜 미디어에 직접 콘텐츠 공유하기 * @param contentId 컨텐츠 ID * @param message 공유 메시지 - * @param authToken 인증 토큰 * @return 공유 결과 정보 */ - SocialShareResponse shareToSocialMedia(Long contentId, String message, String authToken); + SocialShareResponse shareToSocialMedia(Long contentId, String message); } diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareServiceImpl.java index fc2db11..ef5c393 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/SocialShareServiceImpl.java @@ -83,20 +83,11 @@ public void trackShare(Long contentId, String platform, Long userId) { shareStatisticsRepository.save(stats); } - /** - * 사용자 인증 토큰 검증 - */ - @Override - public boolean validateToken(String authToken) { - // 실제 구현에서는 JWT 토큰 검증 등의 로직 필요 - return authToken != null && authToken.startsWith("Bearer "); - } - /** * 소셜 미디어에 직접 콘텐츠 공유하기 (기본 구현) */ @Override - public SocialShareResponse shareToSocialMedia(Long contentId, String message, String authToken) { + public SocialShareResponse shareToSocialMedia(Long contentId, String message) { return SocialShareResponse.failure("이 플랫폼은 직접 공유를 지원하지 않습니다."); } diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java index ab4c4c0..47f56df 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/XSocialShareServiceImpl.java @@ -80,7 +80,7 @@ public String generateXShareUrl(Long contentId, String customText) { * X(트위터)로 직접 공유하기 (현재는 API 접근이 불가능하므로 지원하지 않음) */ @Override - public SocialShareResponse shareToSocialMedia(Long contentId, String message, String authToken) { + public SocialShareResponse shareToSocialMedia(Long contentId, String message) { try { // 공유 URL 생성만 제공 String shareUrl = generateXShareUrl(contentId, message); diff --git a/resource-server/src/main/java/com/example/web/SocialShareController.java b/resource-server/src/main/java/com/example/web/SocialShareController.java index 8524daf..face27e 100644 --- a/resource-server/src/main/java/com/example/web/SocialShareController.java +++ b/resource-server/src/main/java/com/example/web/SocialShareController.java @@ -248,18 +248,10 @@ public ResponseEntity postToSocialMedia( ) ) ) - @RequestBody SocialShareRequest request, - @Parameter(description = "인증 토큰 (OAuth 인증이 필요한 경우)") - @RequestHeader(value = "Authorization", required = false) String authToken) { + @RequestBody SocialShareRequest request) { String platform = request.getPlatform().toLowerCase(); - // OAuth 인증이 필요한 경우 토큰 검증 - if ("x".equals(platform) && (authToken == null || !xShareService.validateToken(authToken))) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED) - .body(SocialShareResponse.failure("인증이 필요합니다.")); - } - try { SocialShareResponse response; @@ -267,22 +259,19 @@ public ResponseEntity postToSocialMedia( case "x": response = xShareService.shareToSocialMedia( request.getContentId(), - request.getMessage(), - authToken); + request.getMessage()); break; case "kakao": response = kakaoShareService.shareToSocialMedia( request.getContentId(), - request.getMessage(), - authToken); + request.getMessage()); break; case "instagram": response = instagramShareService.shareToSocialMedia( request.getContentId(), - request.getMessage(), - authToken); + request.getMessage()); break; default: @@ -297,4 +286,5 @@ public ResponseEntity postToSocialMedia( .body(SocialShareResponse.failure("공유 처리 중 오류 발생: " + e.getMessage())); } } + } From c07ae51e15fe090939d2a92b16f34de00fd60e74 Mon Sep 17 00:00:00 2001 From: Pochomo Date: Thu, 13 Mar 2025 14:32:25 +0900 Subject: [PATCH 3/4] =?UTF-8?q?instagram,=20kakao=20share=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/InstagramSocialShareServiceImpl.java | 8 ++++---- .../socialShare/usecase/KakaoSocialShareServiceImpl.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java index 4e75853..e7c6024 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/InstagramSocialShareServiceImpl.java @@ -33,18 +33,18 @@ public InstagramSocialShareServiceImpl( @Override protected void addPlatformSpecificInfo(Map result, Content content, String baseUrl) { // 인스타그램 공유 URL 생성 - String shareUrl = createShareUrlWithUtm(baseUrl, "instagram"); + String instagramShareUrl = createShareUrlWithUtm(baseUrl, "instagram"); try { // 1. 인스타그램 스토리 딥링크 생성 String storyDeepLink = generateInstagramStoryDeepLink( content.getThumbnailUrl(), - shareUrl, + instagramShareUrl, content.getTitle()); result.put("instagramStoryDeepLink", storyDeepLink); - result.put("instagramShareUrl", shareUrl); - result.put("instagramCopyMessage", content.getTitle() + " " + shareUrl); + result.put("instagramShareUrl", instagramShareUrl); + result.put("instagramCopyMessage", content.getTitle() + " " + instagramShareUrl); result.put("instagramShareInstructions", "인스타그램 공유 방법:\n" + "1. 스토리 공유: '인스타그램 스토리에 공유' 버튼을 클릭하세요.\n" + diff --git a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java index f3a40c6..9ef0349 100644 --- a/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java +++ b/module_oauth/src/main/java/com/spoti/api/auth/domain/oauth2/socialShare/usecase/KakaoSocialShareServiceImpl.java @@ -36,13 +36,13 @@ public KakaoSocialShareServiceImpl( @Override protected void addPlatformSpecificInfo(Map result, Content content, String baseUrl) { // 카카오톡 공유 URL 생성 - String shareUrl = createShareUrlWithUtm(baseUrl, "kakao"); + String kakaoShareUrl = createShareUrlWithUtm(baseUrl, "kakao"); // 카카오톡에서만 사용되는 특정 정보 추가 result.put("kakaoApiKey", kakaoApiKey); // 카카오톡 메시지 템플릿 정보 추가 - Map kakaoTemplate = generateKakaoTemplate(content, shareUrl); + Map kakaoTemplate = generateKakaoTemplate(content, kakaoShareUrl); result.put("kakaoTemplate", kakaoTemplate); } From 2f93136e458a4fffbe592248f6e7dceef2cfb0dd Mon Sep 17 00:00:00 2001 From: Pochomo Date: Thu, 13 Mar 2025 14:45:35 +0900 Subject: [PATCH 4/4] =?UTF-8?q?github=20action=20develop=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=EC=97=90=20=EC=9E=91=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 3 +++ .github/workflows/spotless-check.yml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d307cbc..5e793fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,9 +4,12 @@ on: push: branches: - main + - develop pull_request: branches: - main + - develop + jobs: build: diff --git a/.github/workflows/spotless-check.yml b/.github/workflows/spotless-check.yml index 9b0f7ab..558250c 100644 --- a/.github/workflows/spotless-check.yml +++ b/.github/workflows/spotless-check.yml @@ -4,9 +4,12 @@ on: pull_request: branches: - main + - develop + push: branches: - main + - develop jobs: build: