From 1b91a00a0e68f7c7e09e1d92fa4b0f2bf304d0c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=84=EB=8F=99=EC=9E=AC?= Date: Thu, 21 Aug 2025 22:33:36 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat/#330:=20Meeting=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EC=A0=9C=EB=AA=A9=20=EC=88=98=EC=A0=95=EC=8B=9C=20word?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=9D=98=20=EC=A0=9C=EB=AA=A9=EB=8F=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/domain/meeting/service/MeetingCommandServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/haru/api/domain/meeting/service/MeetingCommandServiceImpl.java b/src/main/java/com/haru/api/domain/meeting/service/MeetingCommandServiceImpl.java index 8e6a8730..afb1528c 100644 --- a/src/main/java/com/haru/api/domain/meeting/service/MeetingCommandServiceImpl.java +++ b/src/main/java/com/haru/api/domain/meeting/service/MeetingCommandServiceImpl.java @@ -139,7 +139,8 @@ public void updateMeetingTitle(User user, Meeting meeting, MeetingRequestDTO.upd meeting.updateTitle(request.getTitle()); - markdownFileUploader.updateFileTitle(meeting.getProceedingPdfKeyName(), request.getTitle()); + markdownFileUploader.updateFileTitle(meeting.getProceedingPdfKeyName(), request.getTitle() + ".pdf"); + markdownFileUploader.updateFileTitle(meeting.getProceedingWordKeyName(), request.getTitle() + ".docx"); meetingRepository.save(meeting); } From 4da20c60595ac106cb4184b409159bde879270a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=84=EB=8F=99=EC=9E=AC?= Date: Thu, 21 Aug 2025 22:35:13 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat/#330:=20=ED=8C=8C=EC=9D=BC=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=EC=8B=9C=20=ED=99=95=EC=9E=A5=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EC=97=AC=20=EC=A0=9C?= =?UTF-8?q?=EB=AA=A9=20=EC=B6=94=EA=B0=80=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/haru/api/infra/s3/AmazonS3Manager.java | 1 + src/main/java/com/haru/api/infra/s3/MarkdownFileUploader.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/haru/api/infra/s3/AmazonS3Manager.java b/src/main/java/com/haru/api/infra/s3/AmazonS3Manager.java index ae161a07..0f4fe1b8 100644 --- a/src/main/java/com/haru/api/infra/s3/AmazonS3Manager.java +++ b/src/main/java/com/haru/api/infra/s3/AmazonS3Manager.java @@ -153,6 +153,7 @@ public byte[] downloadFile(String keyName) { } } + // newDisplayName에 확장자 포함되어있음 public void updateFileTitle(String keyName, String newDisplayName) { try { diff --git a/src/main/java/com/haru/api/infra/s3/MarkdownFileUploader.java b/src/main/java/com/haru/api/infra/s3/MarkdownFileUploader.java index 6c7e88d3..41900bc1 100644 --- a/src/main/java/com/haru/api/infra/s3/MarkdownFileUploader.java +++ b/src/main/java/com/haru/api/infra/s3/MarkdownFileUploader.java @@ -42,7 +42,7 @@ public String createOrUpdatePdf(String markdownText, String featurePath, String } // 3. 결정된 키로 PDF 파일을 S3에 업로드 - amazonS3Manager.uploadFileWithTitle(pdfKeyToUse, pdfBytes, "application/pdf", fileTitle); + amazonS3Manager.uploadFileWithTitle(pdfKeyToUse, pdfBytes, "application/pdf", fileTitle + ".pdf"); log.info("PDF 업로드/갱신 성공. Key: {}", pdfKeyToUse); // 4. 사용된 PDF의 key를 반환 @@ -65,7 +65,7 @@ public String createOrUpdateWord(String markdownText, String featurePath, String // 3. 결정된 키로 Word 파일을 S3에 업로드 String contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; - amazonS3Manager.uploadFileWithTitle(wordKeyToUse, wordBytes, contentType, fileTitle); + amazonS3Manager.uploadFileWithTitle(wordKeyToUse, wordBytes, contentType, fileTitle + ".docx"); log.info("Word 파일 업로드/갱신 성공. Key: {}", wordKeyToUse); // 4. 사용된 Word의 key를 반환 From 1f9941202e822f9062914ebc78327823461fbdac Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 21 Aug 2025 23:06:02 +0900 Subject: [PATCH 3/7] =?UTF-8?q?refactor/#334:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=ED=98=95=EC=8B=9D=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - email 형식 검증 메소드 추가 및 검증 적용 --- .../apiPayload/code/status/ErrorStatus.java | 1 + .../haru/api/infra/mail/SmtpEmailSender.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java index 9e239dcf..f6ca759b 100644 --- a/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java @@ -70,6 +70,7 @@ public enum ErrorStatus implements BaseErrorCode { // 메일 관련 에러 MAIL_SEND_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "MAIL500", "이메일 전송에 실패했습니다."), + MAIL_INVALID_FORMAT(HttpStatus.BAD_REQUEST, "MAIL400", "이메일 형식이 잘못되었습니다."), // SNS 이벤트 관련 에러 SNS_EVENT_NOT_FOUND(HttpStatus.BAD_REQUEST, "SNSEVENT4001", "SNS 이벤트가 존재하지 않습니다."), diff --git a/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java b/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java index 4ebea824..7e391d16 100644 --- a/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java +++ b/src/main/java/com/haru/api/infra/mail/SmtpEmailSender.java @@ -3,6 +3,8 @@ import com.haru.api.global.apiPayload.code.status.ErrorStatus; import com.haru.api.infra.mail.handler.MailHandler; import jakarta.mail.MessagingException; +import jakarta.mail.internet.AddressException; +import jakarta.mail.internet.InternetAddress; import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -27,6 +29,13 @@ public void send( String title, String content ) { + // 1. 이메일 형식 검증 + if (!isValidEmail(to)) { + log.warn("잘못된 이메일 형식 - {}", to); + throw new MailHandler(ErrorStatus.MAIL_INVALID_FORMAT); + } + + // 2. 메일 전송 시도 try { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, false, "UTF-8"); @@ -44,5 +53,16 @@ public void send( throw new MailHandler(ErrorStatus.MAIL_SEND_FAIL); } } + + // RFC 형식 검증 + private boolean isValidEmail(String email) { + try { + InternetAddress internetAddress = new InternetAddress(email); + internetAddress.validate(); // 형식이 틀리면 AddressException 발생 + return true; + } catch (AddressException e) { + return false; + } + } } From 7aa61870b71d48cea737442d585845d994ae6109 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 21 Aug 2025 23:07:49 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refactor/#334:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=ED=98=95=EC=8B=9D=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - email 형식 검증 메소드 추가 및 검증 적용 --- .../com/haru/api/global/apiPayload/code/status/ErrorStatus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java index f6ca759b..f512f785 100644 --- a/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/haru/api/global/apiPayload/code/status/ErrorStatus.java @@ -69,7 +69,7 @@ public enum ErrorStatus implements BaseErrorCode { INVALID_CHOICE_FOR_QUESTION(HttpStatus.BAD_REQUEST, "MOODTRACKER4011", "분위기 트래커 질문에 유효하지 않은 선택지입니다."), // 메일 관련 에러 - MAIL_SEND_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "MAIL500", "이메일 전송에 실패했습니다."), + MAIL_SEND_FAIL(HttpStatus.INTERNAL_SERVER_ERROR, "MAIL500", "이메일 전송에 실패했습니다. (존재하지 않는 이메일일 수 있습니다)"), MAIL_INVALID_FORMAT(HttpStatus.BAD_REQUEST, "MAIL400", "이메일 형식이 잘못되었습니다."), // SNS 이벤트 관련 에러 From 76fb33369525b44d5236e2a2c7b2cfb885b72937 Mon Sep 17 00:00:00 2001 From: 2ghrms Date: Thu, 21 Aug 2025 23:28:45 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor/#336:=20=EC=84=A4=EB=AC=B8=20?= =?UTF-8?q?=EB=A7=88=EA=B0=90=EC=9D=BC=EC=8B=9C=EC=97=90=20=EC=8B=A4?= =?UTF-8?q?=ED=8C=A8=EC=8B=9C=20retry=20=EC=A0=84=EB=9E=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 즉시 생성 시에 중복 처리 제외하도록 반영 --- .../controller/MoodTrackerController.java | 4 ++-- .../service/MoodTrackerCommandServiceImpl.java | 6 ++++++ .../haru/api/infra/redis/RedisReportConsumer.java | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java b/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java index faa5353a..ce951f98 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java +++ b/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java @@ -255,7 +255,7 @@ public ApiResponse downloadLi @PostMapping("/{mood-tracker-hashed-Id}/report-test") @Operation( - summary = "분위기 트래커 설문 리포트 즉시 생성 테스트 API", + summary = "분위기 트래커 설문 리포트 즉시 생성 API", description = "# [v1.0 (2025-07-26)](https://www.notion.so/23f5da7802c58080b4a5e6d24b47d924) 해당 ID의 분위기 트래커 설문 리포트를 즉시 생성합니다." ) @Parameters({ @@ -274,7 +274,7 @@ public ApiResponse generateMoodTrackerReportTest ( @PostMapping("/{mood-tracker-hashed-Id}/report-file-thumbnail-test") @Operation( - summary = "분위기 트래커 설문 리포트, 파일, 썸네일 즉시 생성 테스트 API", + summary = "분위기 트래커 설문 리포트, 파일, 썸네일 즉시 생성 테스트 API + redis에서 제외하여 마감일시에 중복 생성 불가", description = "# [v1.0 (2025-08-14)](https://www.notion.so/24f5da7802c58019a1f7d9c8e882226e) 해당 ID의 분위기 트래커 설문 리포트를 즉시 생성합니다." ) @Parameters({ diff --git a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java index ee51f0df..fc9b30af 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java +++ b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java @@ -19,6 +19,7 @@ import com.haru.api.global.apiPayload.code.status.ErrorStatus; import com.haru.api.global.apiPayload.exception.handler.*; import com.haru.api.global.util.HashIdUtil; +import com.haru.api.infra.redis.RedisReportConsumer; import com.haru.api.infra.redis.RedisReportProducer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -52,6 +53,7 @@ public class MoodTrackerCommandServiceImpl implements MoodTrackerCommandService private final MoodTrackerReportService moodTrackerReportService; private final RedisReportProducer redisReportProducer; + private final RedisReportConsumer redisReportConsumer; private final HashIdUtil hashIdUtil; @@ -318,6 +320,10 @@ public void generateReportTest( public void generateReportFileAndThumbnailTest( MoodTracker moodTracker ) { + // 중복 처리 제외 + redisReportConsumer.removeFromQueue(moodTracker.getId()); + + // 즉시 생성 moodTrackerReportService.generateAndUploadReportFileAndThumbnail(moodTracker.getId()); } } diff --git a/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java b/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java index cb149aa1..30a5a61d 100644 --- a/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java +++ b/src/main/java/com/haru/api/infra/redis/RedisReportConsumer.java @@ -44,4 +44,18 @@ public void pollQueueEvery30Minutes() { } } } + + @Transactional + public void removeFromQueue(Long moodTrackerId) { + try { + Long removed = redisTemplate.opsForZSet().remove(QUEUE_KEY, moodTrackerId.toString()); + if (removed != null && removed > 0) { + log.info("즉시 생성 API 호출로 큐에서 제거됨: {}", moodTrackerId); + } else { + log.info("큐에 존재하지 않아 제거할 항목 없음: {}", moodTrackerId); + } + } catch (Exception e) { + log.error("큐 제거 실패: {}", moodTrackerId, e); + } + } } From c4229af5b0c4c984294880b110af95e1a98b47c2 Mon Sep 17 00:00:00 2001 From: Jinho622 Date: Fri, 22 Aug 2025 00:27:14 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat/#337=20=EC=9D=B8=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EA=B7=B8=EB=9E=A8=20redirect-uri=20=ED=95=9C=EA=B0=9C=20?= =?UTF-8?q?=EB=8D=94=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=9D=B8=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EA=B7=B8=EB=9E=A8=20API=20=EC=97=B0=EB=8F=99=20?= =?UTF-8?q?=EC=8B=9C=20redirect-uri=EB=8F=99=EC=A0=81=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=94=EA=BE=B8=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SnsEventController.java | 8 +++++--- .../entity/enums/InstagramRedirectType.java | 5 +++++ .../service/SnsEventCommandService.java | 3 ++- .../service/SnsEventCommandServiceImpl.java | 9 +++++++-- .../InstagramOauth2RestTemplate.java | 20 +++++++++++++++---- 5 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/haru/api/domain/snsEvent/entity/enums/InstagramRedirectType.java diff --git a/src/main/java/com/haru/api/domain/snsEvent/controller/SnsEventController.java b/src/main/java/com/haru/api/domain/snsEvent/controller/SnsEventController.java index aabe6115..b20a4484 100644 --- a/src/main/java/com/haru/api/domain/snsEvent/controller/SnsEventController.java +++ b/src/main/java/com/haru/api/domain/snsEvent/controller/SnsEventController.java @@ -4,6 +4,7 @@ import com.haru.api.domain.snsEvent.dto.SnsEventResponseDTO; import com.haru.api.domain.snsEvent.entity.SnsEvent; import com.haru.api.domain.snsEvent.entity.enums.Format; +import com.haru.api.domain.snsEvent.entity.enums.InstagramRedirectType; import com.haru.api.domain.snsEvent.entity.enums.ListType; import com.haru.api.domain.snsEvent.service.SnsEventCommandService; import com.haru.api.domain.snsEvent.service.SnsEventQueryService; @@ -56,19 +57,20 @@ public ApiResponse instagramRedirectUri( } @Operation( - summary = "인스타그램 연동 API [v1.1 (2025-08-07)]", - description = "# [v1.1 (2025-08-07)](https://www.notion.so/API-21e5da7802c581cca23dff937ac3f155?p=23f5da7802c5803b98abe74d511c2cf4&pm=s)" + + summary = "인스타그램 연동 API [v1.1 (2025-08-21)]", + description = "# [v1.1 (2025-08-21)](https://www.notion.so/API-21e5da7802c581cca23dff937ac3f155?p=23f5da7802c5803b98abe74d511c2cf4&pm=s)" + " 인스타그램 로그인 후 인증 서버로부터 받은 code를 header에 넣어주시고, workspaceId를 Path Variable로 넣어주세요." ) @PostMapping("/{workspaceId}/link-instagram") public ApiResponse linkInstagramAccount( @RequestHeader("code") String code, @PathVariable String workspaceId, + @RequestParam InstagramRedirectType instagramRedirectType, @Parameter(hidden = true) @AuthWorkspace Workspace workspace ) { System.out.println("Received accessToken: " + code); return ApiResponse.onSuccess( - snsEventCommandService.getInstagramAccessTokenAndAccount(code, workspace) + snsEventCommandService.getInstagramAccessTokenAndAccount(code, workspace, instagramRedirectType) ); } diff --git a/src/main/java/com/haru/api/domain/snsEvent/entity/enums/InstagramRedirectType.java b/src/main/java/com/haru/api/domain/snsEvent/entity/enums/InstagramRedirectType.java new file mode 100644 index 00000000..21934023 --- /dev/null +++ b/src/main/java/com/haru/api/domain/snsEvent/entity/enums/InstagramRedirectType.java @@ -0,0 +1,5 @@ +package com.haru.api.domain.snsEvent.entity.enums; + +public enum InstagramRedirectType { + ONBOARDING, WORKSPACE +} diff --git a/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandService.java b/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandService.java index cda950e2..ced6aef3 100644 --- a/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandService.java +++ b/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandService.java @@ -4,6 +4,7 @@ import com.haru.api.domain.snsEvent.dto.SnsEventResponseDTO; import com.haru.api.domain.snsEvent.entity.SnsEvent; import com.haru.api.domain.snsEvent.entity.enums.Format; +import com.haru.api.domain.snsEvent.entity.enums.InstagramRedirectType; import com.haru.api.domain.snsEvent.entity.enums.ListType; import com.haru.api.domain.user.entity.User; import com.haru.api.domain.workspace.entity.Workspace; @@ -11,7 +12,7 @@ public interface SnsEventCommandService { SnsEventResponseDTO.CreateSnsEventResponse createSnsEvent(User user, Workspace workspace, SnsEventRequestDTO.CreateSnsRequest request); - SnsEventResponseDTO.LinkInstagramAccountResponse getInstagramAccessTokenAndAccount(String code, Workspace workspace); + SnsEventResponseDTO.LinkInstagramAccountResponse getInstagramAccessTokenAndAccount(String code, Workspace workspace, InstagramRedirectType instagramRedirectType); void updateSnsEventTitle(User user, SnsEvent snsEvent, SnsEventRequestDTO.UpdateSnsEventRequest request); diff --git a/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandServiceImpl.java b/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandServiceImpl.java index 81dedc0e..f0afaef0 100644 --- a/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandServiceImpl.java +++ b/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventCommandServiceImpl.java @@ -8,6 +8,7 @@ import com.haru.api.domain.snsEvent.entity.SnsEvent; import com.haru.api.domain.snsEvent.entity.Winner; import com.haru.api.domain.snsEvent.entity.enums.Format; +import com.haru.api.domain.snsEvent.entity.enums.InstagramRedirectType; import com.haru.api.domain.snsEvent.entity.enums.ListType; import com.haru.api.domain.snsEvent.repository.ParticipantRepository; import com.haru.api.domain.snsEvent.repository.SnsEventRepository; @@ -170,14 +171,18 @@ public SnsEventResponseDTO.CreateSnsEventResponse createSnsEvent( @Transactional public SnsEventResponseDTO.LinkInstagramAccountResponse getInstagramAccessTokenAndAccount( String code, - Workspace workspace + Workspace workspace, + InstagramRedirectType instagramRedirectType ) { String shortLivedAccessToken; String longLivedAccessToken; Map userInfo; try { // 1. Access Token 요청 - shortLivedAccessToken = instagramOauth2RestTemplate.getShortLivedAccessTokenUrl(code); + shortLivedAccessToken = instagramOauth2RestTemplate.getShortLivedAccessTokenUrl( + code, + instagramRedirectType + ); // 2. 단기 토큰을 장기(Long-Lived) 토큰으로 교환 longLivedAccessToken = instagramOauth2RestTemplate.getLongLivedAccessToken(shortLivedAccessToken); // 3. 장기 토큰으로 사용자 계정 정보 요청 diff --git a/src/main/java/com/haru/api/infra/api/restTemplate/InstagramOauth2RestTemplate.java b/src/main/java/com/haru/api/infra/api/restTemplate/InstagramOauth2RestTemplate.java index aa3d784b..a0d4aa93 100644 --- a/src/main/java/com/haru/api/infra/api/restTemplate/InstagramOauth2RestTemplate.java +++ b/src/main/java/com/haru/api/infra/api/restTemplate/InstagramOauth2RestTemplate.java @@ -1,5 +1,6 @@ package com.haru.api.infra.api.restTemplate; +import com.haru.api.domain.snsEvent.entity.enums.InstagramRedirectType; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -21,12 +22,17 @@ public class InstagramOauth2RestTemplate { private String instagramClientId; @Value("${instagram.client.secret}") private String instagramClientSecret; - @Value("${instagram.redirect.uri}") - private String instagramRedirectUri; + @Value("${instagram.redirect.uri-onboarding}") + private String instagramRedirectUriOnboarding; + @Value("${instagram.redirect.uri-workspace}") + private String instagramRedirectUriWorkspace; private final RestTemplate restTemplate; - public String getShortLivedAccessTokenUrl(String code) { + public String getShortLivedAccessTokenUrl( + String code, + InstagramRedirectType instagramRedirectType + ) { // 1. Access Token 요청 String tokenUrl = "https://api.instagram.com/oauth/access_token"; RestTemplate restTemplate = new RestTemplate(); @@ -35,7 +41,13 @@ public String getShortLivedAccessTokenUrl(String code) { params.add("client_id", instagramClientId); // 인스타 앱의 클라이언트 ID params.add("client_secret", instagramClientSecret); // 인스타 앱의 클라이언트 시크릿 params.add("grant_type", "authorization_code"); - params.add("redirect_uri", instagramRedirectUri); // 인가코드와 동일한 redirect_uri + // 인가코드와 동일한 redirect_uri + if (instagramRedirectType == InstagramRedirectType.ONBOARDING) { + params.add("redirect_uri", instagramRedirectUriOnboarding); + } else if(instagramRedirectType == InstagramRedirectType.WORKSPACE) { + System.out.println("Using workspace redirect URI: " + instagramRedirectUriWorkspace); + params.add("redirect_uri", instagramRedirectUriWorkspace); + } params.add("code", code); HttpHeaders headers = new HttpHeaders(); From c10d82b2c1dcab687889a5f02c3d01ec88bd27a5 Mon Sep 17 00:00:00 2001 From: Jinho622 Date: Fri, 22 Aug 2025 00:31:46 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat/#337:=20application-test.yml=EC=97=90?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=EB=90=9C=20redirect-uri=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/application-test.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index 5f8ed5ae..f100cf77 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -57,4 +57,5 @@ instagram: id: "dummy-client-id" secret: "dummy-client-secret" redirect: - uri: "dummy-redirect-uri" \ No newline at end of file + uri-onboarding: "dummy-redirect-uri" + uri-workspace: "dummy-redirect-uri" \ No newline at end of file