diff --git a/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java b/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java index d2e53e38..3400e8f5 100644 --- a/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java +++ b/Match-Api/src/main/java/com/example/matchapi/common/ExceptionAdvice.java @@ -126,7 +126,7 @@ private void getExceptionStackTrace(Exception e, User user, HttpServletRequest r pw.append("ERROR_MESSAGE : ").append(errors.toString()).append("\n"); } else { - pw.append("ERROR_MESSAGE : ").append(e.getMessage()).append("\n"); + pw.append("ERROR_MESSAGE : ").append(e.toString()).append("\n"); pw.append("ERROR_MESSAGE : ").append(e.getLocalizedMessage()).append("\n"); } pw.append("====================================================================="); diff --git a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java index 8faf2522..d4ed5f5b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java +++ b/Match-Api/src/main/java/com/example/matchapi/config/SecurityConfig.java @@ -3,6 +3,7 @@ import com.example.matchapi.common.security.*; import com.example.matchdomain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; @@ -14,11 +15,7 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.CorsUtils; -import org.springframework.http.HttpMethod; -import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) @@ -29,6 +26,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; private final JwtAccessDeniedHandler jwtAccessDeniedHandler; private final UserDetailsService userDetailsService; + @Value("${spring.config.activate.on-profile}") + private String profile; @Bean public PasswordEncoder passwordEncoder() { @@ -51,67 +50,63 @@ public void configure(WebSecurity web) throws Exception { ; } + protected void configure(HttpSecurity httpSecurity) throws Exception { + configureCsrfAndHeaders(httpSecurity); + configureSessionManagement(httpSecurity); + configureExceptionHandling(httpSecurity); + configureAuthorizationRequests(httpSecurity); + disableFormLogin(httpSecurity); + configureEnvironmentSpecificAccess(httpSecurity); + } + private void configureCsrfAndHeaders(HttpSecurity httpSecurity) throws Exception { httpSecurity - // token을 사용하는 방식이기 때문에 csrf를 disable합니다. .csrf().disable() - // enable h2-console .headers() .frameOptions() - .sameOrigin() + .sameOrigin(); + } - // 세션을 사용하지 않기 때문에 STATELESS로 설정 - .and() + private void configureSessionManagement(HttpSecurity httpSecurity) throws Exception { + httpSecurity .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .sessionCreationPolicy(SessionCreationPolicy.STATELESS); + } - .and() + private void configureExceptionHandling(HttpSecurity httpSecurity) throws Exception { + httpSecurity .exceptionHandling() .authenticationEntryPoint(jwtAuthenticationEntryPoint) - .accessDeniedHandler(jwtAccessDeniedHandler) - + .accessDeniedHandler(jwtAccessDeniedHandler); + } - .and() + private void configureAuthorizationRequests(HttpSecurity httpSecurity) throws Exception { + httpSecurity .authorizeRequests() .requestMatchers(CorsUtils::isPreFlightRequest).permitAll() - .antMatchers("/swagger-resources/**").permitAll() - .antMatchers("/swagger-ui/**").permitAll() - .antMatchers("/api-docs/**").permitAll() .antMatchers("/webjars/**").permitAll() - .antMatchers("/v3/api-docs").permitAll() - .antMatchers("/image/**").permitAll() .antMatchers("/users/refresh").permitAll() - .antMatchers("/profile").permitAll() - .antMatchers("/login/**").permitAll() - .antMatchers("/test/**").permitAll() - .antMatchers("/login/**").permitAll() .antMatchers("/auth/**").permitAll() .antMatchers("/health").permitAll() .antMatchers("/order").permitAll() - .antMatchers("/order/serverAuth").permitAll() .antMatchers("/projects").permitAll() .antMatchers(HttpMethod.GET, "/projects/{projectId}").permitAll() - .antMatchers("/projects/list").authenticated() - .antMatchers("/").permitAll() - .antMatchers("/serverAuth").permitAll() .antMatchers(HttpMethod.GET,"/donation-temporaries").permitAll() + .antMatchers("/projects/list").authenticated() .antMatchers("/users/refresh").permitAll() - .antMatchers(HttpMethod.GET,"/donation-temporaries").permitAll() + .antMatchers("/terms/**").permitAll() .antMatchers("/admin/projects/**").hasAnyRole("ADMIN") .antMatchers("/admin/users/**").hasAnyRole("ADMIN") - .antMatchers("/admin/users/**").hasAnyRole("ADMIN") .antMatchers("/admin/donation-users/**").hasAnyRole("ADMIN") .antMatchers("/admin/donation-temporaries/**").hasAnyRole("ADMIN") .antMatchers("/admin/order/**").hasAnyRole("ADMIN") .antMatchers("/admin/auth/logIn").permitAll() - .antMatchers("/test/fcm/user").authenticated() - .antMatchers("/terms/**").permitAll() - .anyRequest().authenticated() - .and() .apply(new JwtSecurityConfig(jwtService)); + } + private void disableFormLogin(HttpSecurity httpSecurity) throws Exception { httpSecurity .httpBasic() .and() @@ -119,17 +114,30 @@ protected void configure(HttpSecurity httpSecurity) throws Exception { .disable(); } - @Bean - public CorsConfigurationSource corsConfigurationSource() { - CorsConfiguration configuration = new CorsConfiguration(); - configuration.addAllowedOrigin("*"); // 모든 도메인으로부터의 요청을 허용 - configuration.addAllowedMethod("*"); // 모든 HTTP 메서드를 허용 - configuration.addAllowedHeader("DEVICE_ID"); // 특정 헤더를 허용 + private void configureEnvironmentSpecificAccess(HttpSecurity httpSecurity) throws Exception { + if (!profile.equals("prod")) { + allowSwaggerForNonProd(httpSecurity); + } else { + restrictSwaggerForProd(httpSecurity); + } + } - UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); - source.registerCorsConfiguration("/**", configuration); + private void allowSwaggerForNonProd(HttpSecurity httpSecurity) throws Exception { + httpSecurity + .authorizeRequests() + .antMatchers("/swagger-ui/**").permitAll() + .antMatchers("/api-docs/**").permitAll() + .antMatchers("/swagger-resources/**").permitAll() + .anyRequest().authenticated(); + } - return source; + private void restrictSwaggerForProd(HttpSecurity httpSecurity) throws Exception { + httpSecurity + .authorizeRequests() + .antMatchers("/swagger-ui/**").authenticated() + .antMatchers("/api-docs/**").authenticated() + .antMatchers("/swagger-resources/**").authenticated() + .anyRequest().authenticated(); } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java index 88ea4703..8b8a1f2d 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/controller/DonationController.java @@ -1,17 +1,23 @@ package com.example.matchapi.donation.controller; +import com.example.matchapi.donation.dto.DonationReq; import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.service.DonationService; +import com.example.matchapi.project.service.ProjectService; import com.example.matchapi.user.dto.UserRes; import com.example.matchcommon.annotation.ApiErrorCodeExample; +import com.example.matchcommon.annotation.RedissonLock; +import com.example.matchcommon.exception.errorcode.RequestErrorCode; import com.example.matchcommon.reponse.CommonResponse; import com.example.matchcommon.reponse.PageResponse; import com.example.matchdomain.donation.exception.*; +import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.exception.UserAuthErrorCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -25,6 +31,7 @@ @Tag(name = "05-Donation💸",description = "기부금 관련 API 입니다.") public class DonationController { private final DonationService donationService; + private final ProjectService projectService; @PatchMapping("/{donationId}") @ApiErrorCodeExample({UserAuthErrorCode.class, DonationRefundErrorCode.class}) @@ -183,4 +190,24 @@ public CommonResponse>> getBurnin return CommonResponse.onSuccess(donationService.getBurningFlameList(user, page, size)); } + + @Operation(summary = "05-13 튜토리얼 기부 리스트", description = "튜토리얼 기부 리스트") + @GetMapping("/tutorial") + @ApiErrorCodeExample(UserAuthErrorCode.class) + public CommonResponse> getTutorialDonation( + @AuthenticationPrincipal User user + ){ + return CommonResponse.onSuccess(projectService.getTutorialDonation()); + } + + @Operation(summary = "05-14 튜토리얼 기부 ", description = "튜토리얼 1원 기부 POST API 입니다.") + @PostMapping("/tutorial") + @ApiErrorCodeExample({UserAuthErrorCode.class, RequestErrorCode.class}) + @RedissonLock(LockName = "유저 튜토리얼 기부", key = "#user.id") + public CommonResponse postTutorialDonation( + @AuthenticationPrincipal User user, + @RequestBody DonationReq.Tutorial tutorial){ + Project project = projectService.findByProjectId(tutorial.getProjectId()); + return CommonResponse.onSuccess(donationService.postTutorialDonation(user, tutorial, project)); + } } \ No newline at end of file diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/converter/DonationConverter.java b/Match-Api/src/main/java/com/example/matchapi/donation/converter/DonationConverter.java index fded604b..3200b480 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/converter/DonationConverter.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/converter/DonationConverter.java @@ -1,14 +1,22 @@ package com.example.matchapi.donation.converter; import com.example.matchapi.common.util.TimeHelper; +import com.example.matchapi.donation.dto.DonationReq; import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.helper.DonationHelper; +import com.example.matchapi.order.dto.OrderRes; import com.example.matchapi.project.dto.ProjectRes; import com.example.matchcommon.annotation.Converter; import com.example.matchdomain.donation.entity.*; +import com.example.matchdomain.donation.entity.enums.DonationStatus; import com.example.matchdomain.donation.entity.enums.HistoryStatus; +import com.example.matchdomain.donation.entity.enums.PayMethod; +import com.example.matchdomain.donation.entity.enums.RegularStatus; +import com.example.matchdomain.donation.entity.flameEnum.FlameImage; +import com.example.matchdomain.donation.entity.flameEnum.FlameType; import com.example.matchdomain.donation.repository.DonationUserRepository; -import com.example.matchdomain.donation.repository.HistoryImageRepository; +import com.example.matchdomain.project.entity.Project; +import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -306,4 +314,28 @@ public List convertToPayList(List donationUse } + public DonationUser convertToTutorialDonation(User user, DonationReq.Tutorial tutorial, OrderRes.CreateInherenceDto createInherenceDto) { + return DonationUser.builder() + .userId(user.getId()) + .projectId(tutorial.getProjectId()) + .price(1L) + .donationStatus(DonationStatus.EXECUTION_BEFORE) + .payMethod(PayMethod.TUTORIAL) + .inherenceName(createInherenceDto.getInherenceName()) + .inherenceNumber(createInherenceDto.getInherenceNumber()) + .regularStatus(RegularStatus.ONE_TIME) + .flameImage(FlameImage.NORMAL_IMG.getImg()) + .flameType(FlameType.NORMAL_FLAME) + .build(); + } + + public DonationRes.CompleteDonation convertToCompleteDonation(DonationUser donationUser, Project project) { + return DonationRes.CompleteDonation + .builder() + .projectId(donationUser.getProjectId()) + .image(donationUser.getFlameImage()) + .inherenceName(donationUser.getInherenceName()) + .randomMessage(donationHelper.createRandomMessageTutorial(project.getProjectKind())) + .build(); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationReq.java b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationReq.java index 9f1dfa5d..c4f5a8ed 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationReq.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationReq.java @@ -30,4 +30,14 @@ public static class SomeExecution{ private Long amount; } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + @ToString + public static class Tutorial { + private Long projectId; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java index 4f9fd273..244280f2 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/dto/DonationRes.java @@ -3,6 +3,7 @@ import com.example.matchdomain.donation.entity.enums.DonationStatus; import com.example.matchdomain.donation.entity.enums.HistoryStatus; import com.example.matchdomain.donation.entity.enums.RegularPayStatus; +import com.example.matchdomain.project.entity.enums.ProjectKind; import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -333,4 +334,34 @@ public static class ProjectDonationStatus { @Schema(description = "지출 완료 금액") private int completeAmount; } + + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class Tutorial { + private Long projectId; + + private ProjectKind projectKind; + } + + @Getter + @Setter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class CompleteDonation { + private Long projectId; + + @Schema(description = "고유 불꽃이 이름") + private String inherenceName; + + @Schema(description = "불꽃이 이미지") + private String image; + + @Schema(description = "랜덤 불꽃이 메세지") + private String randomMessage; + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java index 9b042886..0aeabe0b 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/helper/DonationHelper.java @@ -5,6 +5,7 @@ import com.example.matchdomain.common.model.RandomMessage; import com.example.matchdomain.donation.entity.DonationUser; import com.example.matchdomain.donation.entity.enums.DonationStatus; +import com.example.matchdomain.project.entity.enums.ProjectKind; import lombok.RequiredArgsConstructor; import java.text.DecimalFormat; @@ -15,6 +16,7 @@ import java.util.Random; import java.util.stream.Collectors; +import static com.example.matchcommon.constants.RandomMessageStatic.*; import static com.example.matchdomain.common.model.MessageType.*; import static com.example.matchdomain.donation.entity.enums.RegularStatus.ONE_TIME; @@ -71,4 +73,31 @@ public String getRandomMessageType(MessageType messageType) { public boolean isOneDayPassed(LocalDateTime dateTime) { return Duration.between(dateTime, LocalDateTime.now()).toDays() >= 1; } + + public String createRandomMessageTutorial(ProjectKind projectKind) { + switch (projectKind){ + case CHILDREN: + return CHILDREN_MESSAGE; + case YOUTH: + return YOUTH_MESSAGE; + case WOMEN: + return WOMEN_MESSAGE; + case ELDER: + return ELDER_MESSAGE; + case DISABLED: + return DISABLED_MESSAGE; + case SOCIAL: + return SOCIAL_MESSAGE; + case NEIGHBOR: + return NEIGHBOR_MESSAGE; + case EARTH: + return EARTH_MESSAGE; + case ANIMAL: + return ANIMAL_MESSAGE; + case ENVIRONMENT: + return ENVIRONMENT_MESSAGE; + default: + return RANDOM_MESSAGE; + } + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java index 75cf57cc..6ff67b55 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationHistoryService.java @@ -26,6 +26,6 @@ public void saveDonationHistory(DonationHistory donationHistory){ } public void oneTimeDonationHistory(Long donationId){ - saveDonationHistory(donationConverter.convertToDonationHistory(donationId, CREATE)); + donationHistoryAdaptor.saveDonationHistory(donationConverter.convertToDonationHistory(donationId, CREATE)); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java index f8198c9b..88a2d23a 100644 --- a/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java +++ b/Match-Api/src/main/java/com/example/matchapi/donation/service/DonationService.java @@ -2,11 +2,12 @@ import com.example.matchapi.donation.converter.DonationConverter; import com.example.matchapi.donation.converter.RegularPaymentConverter; +import com.example.matchapi.donation.dto.DonationReq; import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.donation.helper.DonationHelper; -import com.example.matchapi.portone.dto.PaymentReq; -import com.example.matchapi.portone.service.PaymentService; +import com.example.matchapi.order.helper.OrderHelper; import com.example.matchapi.project.dto.ProjectRes; +import com.example.matchcommon.annotation.RedissonLock; import com.example.matchcommon.exception.BadRequestException; import com.example.matchcommon.reponse.PageResponse; import com.example.matchdomain.donation.adaptor.DonationAdaptor; @@ -19,15 +20,12 @@ import com.example.matchdomain.project.entity.Project; import com.example.matchdomain.user.entity.User; import com.example.matchinfrastructure.pay.portone.service.PortOneService; -import com.siot.IamportRestClient.response.Payment; import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import javax.transaction.Transactional; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.List; import static com.example.matchdomain.common.model.Status.ACTIVE; @@ -50,6 +48,8 @@ public class DonationService { private final RegularPaymentConverter regularPaymentConverter; private final DonationHelper donationHelper; private final PortOneService portOneService; + private final OrderHelper orderHelper; + private final DonationHistoryService donationHistoryService; public PageResponse> getDonationList(Long userId, int filter, int page, int size) { @@ -160,4 +160,12 @@ public void deleteRegularPayment(User user) { } regularPaymentAdaptor.saveAll(regularPayments); } + + public DonationRes.CompleteDonation postTutorialDonation(User user, DonationReq.Tutorial tutorial, Project project) { + DonationUser donationUser = donationAdaptor.save(donationConverter.convertToTutorialDonation(user, tutorial, orderHelper.createInherence(user))); + + donationHistoryService.oneTimeDonationHistory(donationUser.getId()); + + return donationConverter.convertToCompleteDonation(donationUser, project); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java index 629dae45..54d10025 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/controller/ProjectController.java @@ -149,11 +149,10 @@ public CommonResponse>> getMatchHisto @CheckIdExist @PostMapping("/comment/{projectId}") @ApiErrorCodeExample({UserAuthErrorCode.class, ProjectGetErrorCode.class, RequestErrorCode.class}) - public CommonResponse postComment(@Parameter(hidden = true) @AuthenticationPrincipal User user, + public CommonResponse postComment(@Parameter(hidden = true) @AuthenticationPrincipal User user, @Parameter(description = "프로젝트 id") @PathVariable("projectId") Long projectId, @Valid @RequestBody ProjectReq.Comment comment){ - projectService.postComment(user, projectId, comment); - return CommonResponse.onSuccess("응원 달기 성공"); + return CommonResponse.onSuccess(projectService.postComment(user, projectId, comment)); } @Operation(summary = "03-11💻 후원 응원 신고하기 #FRAME_후원 상세조회", description = "후원 응원 신고하기 기능입니다") diff --git a/Match-Api/src/main/java/com/example/matchapi/project/converter/ProjectConverter.java b/Match-Api/src/main/java/com/example/matchapi/project/converter/ProjectConverter.java index 8fdca170..6642b9ff 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/converter/ProjectConverter.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/converter/ProjectConverter.java @@ -1,7 +1,6 @@ package com.example.matchapi.project.converter; -import com.example.matchapi.common.util.TimeHelper; -import com.example.matchapi.donation.helper.DonationHelper; +import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.project.dto.ProjectReq; import com.example.matchapi.project.dto.ProjectRes; import com.example.matchapi.project.helper.ProjectHelper; @@ -12,11 +11,11 @@ import com.example.matchdomain.donation.entity.enums.RegularPayStatus; import com.example.matchdomain.donation.repository.RegularPaymentRepository; import com.example.matchdomain.project.dto.ProjectDto; -import com.example.matchdomain.project.dto.ProjectList; import com.example.matchdomain.project.entity.*; import com.example.matchdomain.project.entity.enums.ImageRepresentStatus; import com.example.matchdomain.project.entity.enums.ReportReason; import com.example.matchdomain.project.repository.ProjectRepository; +import com.example.matchdomain.user.entity.User; import lombok.RequiredArgsConstructor; import java.time.LocalDateTime; @@ -339,15 +338,34 @@ public List convertToProjectListWebForNotLogin(List convertToTutorialDonation(List projects) { + List tutorials = new ArrayList<>(); + + projects.forEach( + result -> tutorials.add( + convertToTutorialDetail(result) + ) + ); + return tutorials; + } + + private DonationRes.Tutorial convertToTutorialDetail(Project result) { + return DonationRes.Tutorial + .builder() + .projectId(result.getId()) + .projectKind(result.getProjectKind()) .build(); } } diff --git a/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectRes.java b/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectRes.java index 25abe60b..6ad2cd24 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectRes.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/dto/ProjectRes.java @@ -97,7 +97,6 @@ public static class ProjectImgList{ @AllArgsConstructor @NoArgsConstructor public static class CommentList { - private Long commentId; private String comment; diff --git a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java index ce988c8f..f5b5706e 100644 --- a/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java +++ b/Match-Api/src/main/java/com/example/matchapi/project/service/ProjectService.java @@ -1,6 +1,7 @@ package com.example.matchapi.project.service; import com.example.matchapi.common.util.MessageHelper; +import com.example.matchapi.donation.dto.DonationRes; import com.example.matchapi.project.converter.ProjectConverter; import com.example.matchapi.project.dto.ProjectReq; import com.example.matchapi.project.dto.ProjectRes; @@ -273,8 +274,10 @@ public PageResponse> projectList(User user, int pa } - public void postComment(User user, Long projectId, ProjectReq.Comment comment) { - projectCommentRepository.save(projectConverter.convertToComment(user.getId(), projectId, comment.getComment())); + public ProjectRes.CommentList postComment(User user, Long projectId, ProjectReq.Comment comment) { + ProjectComment projectComment = projectCommentRepository.save(projectConverter.convertToComment(user.getId(), projectId, comment.getComment())); + + return projectConverter.projectComment(user, projectComment); } public void reportComment(Long commentId, ReportReason reportReason) { @@ -297,11 +300,6 @@ public Project checkProjectExists(Long projectId, RegularStatus regularStatus) { public PageResponse> getProjectComment(User user, Long projectId, int page, int size) { Pageable pageable = PageRequest.of(page, size); - Long userId; - if(authHelper.checkGuest(user)) userId = user.getId(); - else { - userId = 0L; - } Page projectComments = projectCommentRepository.findByProjectIdAndStatusOrderByCreatedAtAsc(projectId, ACTIVE,pageable); @@ -309,7 +307,7 @@ public PageResponse> getProjectComment(User user, L projectComments.getContent().forEach( result-> { commentLists.add( - projectConverter.projectComment(userId, result) + projectConverter.projectComment(user, result) ); } ); @@ -330,4 +328,9 @@ public Project findByProject(String projectId) { public Project findByProjectId(Long projectId) { return projectAdaptor.findById(projectId); } + + public List getTutorialDonation() { + List projects = projectAdaptor.getRandom3Project(); + return projectConverter.convertToTutorialDonation(projects); + } } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/AligoService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/AligoService.java new file mode 100644 index 00000000..69b05b52 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/AligoService.java @@ -0,0 +1,17 @@ +package com.example.matchapi.user.service; + +import com.example.matchcommon.reponse.CommonResponse; +import com.example.matchinfrastructure.match_aligo.client.MatchAligoFeignClient; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AligoService { + private final MatchAligoFeignClient matchAligoFeignClient; + + public CommonResponse sendSmsAuth(String token, String phone, String code){ + return matchAligoFeignClient.sendSmsAuth(token, phone, code); + } + +} diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java index 299b798a..47b2ee15 100644 --- a/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/AuthService.java @@ -62,53 +62,39 @@ @Service @RequiredArgsConstructor public class AuthService { - private final KakaoFeignClient kakaoFeignClient; - private final KakaoLoginFeignClient kakaoLoginFeignClient; - private final NaverLoginFeignClient naverLoginFeignClient; - private final NaverFeignClient naverFeignClient; - private final KakaoProperties kakaoProperties; - private final NaverProperties naverProperties; - private final UserRepository userRepository; private final UserAddressRepository userAddressRepository; private final JwtService jwtService; private final AuthHelper authHelper; private final UserConverter userConverter; private final PasswordEncoder passwordEncoder; private final SmsHelper smsHelper; - private final JwtProperties jwtProperties; - private final MailService mailService; private final CodeAuthRepository codeAuthRepository; - private final MatchAligoFeignClient matchAligoFeignClient; private final AppleAuthService authService; private final UserAdaptor userAdaptor; + private final KakaoService kakaoService; + private final NaverService naverService; + private final MailService mailService; + private final AligoService aligoService; @Transactional public UserRes.UserToken kakaoLogIn(UserReq.SocialLoginToken socialLoginToken) { boolean isNew ; - KakaoUserInfoDto kakaoUserInfoDto = kakaoFeignClient.getInfo(BEARER + socialLoginToken.getAccessToken()); + + KakaoUserInfoDto kakaoUserInfoDto = kakaoService.getKakaoInfo(socialLoginToken.getAccessToken()); Long userId; - Optional user = userRepository.findBySocialIdAndSocialTypeAndStatus(kakaoUserInfoDto.getId(), KAKAO, ACTIVE); + + Optional user = userAdaptor.existsSocialUser(kakaoUserInfoDto.getId(), KAKAO); + authHelper.checkUserExists(kakaoUserInfoDto.getPhoneNumber(), KAKAO); - //소셜 로그인 정보가 없을 시 if (user.isEmpty()){ userId = kakaoSignUp(kakaoUserInfoDto); - KakaoUserAddressDto kakaoUserAddressDto = kakaoFeignClient.getUserAddress(BEARER+socialLoginToken.getAccessToken()); - if(!kakaoUserAddressDto.isShippingAddressesNeedsAgreement()){ - List userAddressList = new ArrayList<>(); - for(KakaoUserAddressDto.ShippingAddresses shippingAddresses : kakaoUserAddressDto.getShippingAddresses()){ - UserAddress userAddress = userConverter.convertToAddUserAddress(userId,shippingAddresses); - userAddressList.add(userAddress); - } - userAddressRepository.saveAll(userAddressList); - } + saveUserAddress(userId, socialLoginToken.getAccessToken()); isNew = true; } - //소셜 로그인 정보가 있을 시 else { - authHelper.checkUserExists(kakaoUserInfoDto.getPhoneNumber(), KAKAO); userId = user.get().getId(); isNew = false; } @@ -116,6 +102,18 @@ public UserRes.UserToken kakaoLogIn(UserReq.SocialLoginToken socialLoginToken) { return createToken(userId, isNew); } + private void saveUserAddress(Long userId, String accessToken) { + KakaoUserAddressDto kakaoUserAddressDto = kakaoService.getKakaoUserAddress(accessToken); + if(!kakaoUserAddressDto.isShippingAddressesNeedsAgreement()){ + List userAddressList = new ArrayList<>(); + for(KakaoUserAddressDto.ShippingAddresses shippingAddresses : kakaoUserAddressDto.getShippingAddresses()){ + UserAddress userAddress = userConverter.convertToAddUserAddress(userId,shippingAddresses); + userAddressList.add(userAddress); + } + userAddressRepository.saveAll(userAddressList); + } + } + private UserRes.UserToken createToken(Long userId, boolean isNew) { UserRes.Token token = jwtService.createTokens(userId); @@ -126,49 +124,38 @@ private UserRes.UserToken createToken(Long userId, boolean isNew) { private Long kakaoSignUp(KakaoUserInfoDto kakaoUserInfoDto) { User user = userConverter.convertToKakaoSignUpUser(kakaoUserInfoDto, KAKAO); - System.out.println(kakaoUserInfoDto.getPhoneNumber()); - - return userRepository.save(user).getId(); + return userAdaptor.save(user).getId(); } @Transactional public Long naverSignUp(NaverUserInfoDto naverUserInfoDto) { - return userRepository.save(userConverter.convertToNaverSignUpUser(naverUserInfoDto, NAVER)).getId(); + return userAdaptor.save(userConverter.convertToNaverSignUpUser(naverUserInfoDto, NAVER)).getId(); } public KakaoLoginTokenRes getOauthToken(String code, String referer) { - return kakaoLoginFeignClient.kakaoAuth( - kakaoProperties.getKakaoClientId(), - kakaoProperties.getKakaoRedirectUrl(), - kakaoProperties.getKakaoClientSecret(), - code); + return kakaoService.getKakaoOauthToken(code); } public UserRes.UserToken getNaverOauthToken(String code) { - NaverTokenRes naverTokenRes = naverLoginFeignClient.naverAuth( - naverProperties.getNaverClientId(), - naverProperties.getNaverClientSecret(), - code - ); - - return naverLogIn(naverTokenRes.getAccess_token()); + return naverLogIn(naverService.getNaverOauthToken(code).getAccess_token()); } public UserRes.UserToken naverLogIn(String socialToken) { Long userId; boolean isNew; - NaverUserInfoDto naverUserInfoDto = naverFeignClient.getInfo(BEARER + socialToken); + + NaverUserInfoDto naverUserInfoDto = naverService.getNaverUserInfo(socialToken); authHelper.checkUserExists(naverUserInfoDto.getMobile(), NAVER); - Optional user = userRepository.findBySocialIdAndSocialTypeAndStatus(naverUserInfoDto.getResponse().getId(), NAVER, ACTIVE); + Optional user = userAdaptor.existsSocialUser(naverUserInfoDto.getResponse().getId(), NAVER); if (user.isEmpty()) { userId = naverSignUp(naverUserInfoDto); isNew = true; } else { - isNew = false; userId = user.get().getId(); + isNew = false; } return createToken(userId, isNew); @@ -180,7 +167,7 @@ public UserRes.UserToken signUpUser(UserReq.SignUpUser signUpUser) { if(userAdaptor.existsPhoneNumber(signUpUser.getPhone())) throw new BadRequestException(USERS_EXISTS_PHONE); if(userAdaptor.existsEmail(signUpUser.getEmail())) throw new BadRequestException(USERS_EXISTS_EMAIL); - return createToken(userRepository.save(userConverter.convertToSignUpUser(signUpUser)).getId(), true); + return createToken(userAdaptor.save(userConverter.convertToSignUpUser(signUpUser)).getId(), true); } public void checkUserPhone(UserReq.UserPhone userPhone) { @@ -192,33 +179,19 @@ public void checkUserEmail(UserReq.UserEmail userEmail) { } public UserRes.UserToken logIn(UserReq.LogIn logIn) { - User user=userRepository.findByUsernameAndStatus(logIn.getEmail(), ACTIVE).orElseThrow(() -> new UnauthorizedException(NOT_EXIST_USER)); + User user = userAdaptor.findByUsernameAndStatus(logIn.getEmail()); if(!passwordEncoder.matches(logIn.getPassword(),user.getPassword())) throw new BadRequestException(NOT_CORRECT_PASSWORD); - Long userId = user.getId(); - return createToken(userId, false); - } - - public KakaoUserAddressDto getKakaoAddress(String accessToken) { - return kakaoFeignClient.getUserAddress(BEARER + accessToken); - } - - - public NaverAddressDto getNaverAddress(String accessToken) { - return naverFeignClient.getUserAddress(BEARER + accessToken); + return createToken(user.getId(), false); } - public UserRes.UserToken adminLogIn(UserReq.LogIn logIn) { - User user=userRepository.findByUsername(logIn.getEmail()).orElseThrow(() -> new UnauthorizedException(NOT_EXIST_USER)); - + User user= userAdaptor.findByUserName(logIn.getEmail()); if(!passwordEncoder.matches(logIn.getPassword(),user.getPassword())) throw new BadRequestException(NOT_CORRECT_PASSWORD); if(!user.getRole().contains(ROLE_ADMIN.getValue())) throw new BadRequestException(NOT_ADMIN); - Long userId = user.getId(); - - return createToken(userId, false); + return createToken(user.getId(), false); } public void sendEmailMessage(String email) { @@ -240,7 +213,7 @@ public void sendPhone(String phone) { checkUserPhone(new UserReq.UserPhone(phone)); String code = smsHelper.createRandomNumber(); codeAuthRepository.save(CodeAuth.builder().auth(phone).code(code).ttl(300).build()); - CommonResponse sendRes = matchAligoFeignClient.sendSmsAuth(jwtService.createToken(1L), phone, code); + CommonResponse sendRes = aligoService.sendSmsAuth(jwtService.createToken(1L), phone, code); } public void checkPhoneAuth(UserReq.UserPhoneAuth phone) { @@ -251,7 +224,7 @@ public void checkPhoneAuth(UserReq.UserPhoneAuth phone) { public UserRes.UserToken appleLogin(UserReq.SocialLoginToken socialLoginToken) { AppleUserRes appleUserRes = authService.appleLogin(socialLoginToken.getAccessToken()); - if(userRepository.existsByEmailAndSocialTypeNot(appleUserRes.getEmail(), APPLE)) throw new BadRequestException(USERS_EXISTS_EMAIL); + if(userAdaptor.existsEmailAndSocial(appleUserRes.getEmail(), APPLE)) throw new BadRequestException(USERS_EXISTS_EMAIL); Optional user = userAdaptor.existsSocialUser(appleUserRes.getSocialId(), APPLE); @@ -273,7 +246,7 @@ public UserRes.UserToken appleSignUp(UserReq.@Valid AppleSignUp appleSignUp) { if(userAdaptor.existsEmail(appleSignUp.getEmail())) throw new BadRequestException(USERS_EXISTS_EMAIL); - return createToken(userRepository.save(userConverter.convertToAppleUserSignUp(appleSignUp)).getId(), true); + return createToken(userAdaptor.save(userConverter.convertToAppleUserSignUp(appleSignUp)).getId(), true); } diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/KakaoService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/KakaoService.java new file mode 100644 index 00000000..e0279eb8 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/KakaoService.java @@ -0,0 +1,39 @@ +package com.example.matchapi.user.service; + +import com.example.matchcommon.properties.KakaoProperties; +import com.example.matchinfrastructure.oauth.kakao.client.KakaoFeignClient; +import com.example.matchinfrastructure.oauth.kakao.client.KakaoLoginFeignClient; +import com.example.matchinfrastructure.oauth.kakao.dto.KakaoLoginTokenRes; +import com.example.matchinfrastructure.oauth.kakao.dto.KakaoUserAddressDto; +import com.example.matchinfrastructure.oauth.kakao.dto.KakaoUserInfoDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import static com.example.matchcommon.constants.MatchStatic.BEARER; + +@Service +@RequiredArgsConstructor +public class KakaoService { + private final KakaoFeignClient kakaoFeignClient; + private final KakaoLoginFeignClient kakaoLoginFeignClient; + private final KakaoProperties kakaoProperties; + + + public KakaoUserInfoDto getKakaoInfo(String socialToken){ + return kakaoFeignClient.getInfo(BEARER + socialToken); + } + + public KakaoLoginTokenRes getKakaoOauthToken(String code){ + return kakaoLoginFeignClient.kakaoAuth( + kakaoProperties.getKakaoClientId(), + kakaoProperties.getKakaoRedirectUrl(), + kakaoProperties.getKakaoClientSecret(), + code); + } + + public KakaoUserAddressDto getKakaoUserAddress(String socialToken){ + return kakaoFeignClient.getUserAddress(BEARER + socialToken); + } + + +} diff --git a/Match-Api/src/main/java/com/example/matchapi/user/service/NaverService.java b/Match-Api/src/main/java/com/example/matchapi/user/service/NaverService.java new file mode 100644 index 00000000..f4823964 --- /dev/null +++ b/Match-Api/src/main/java/com/example/matchapi/user/service/NaverService.java @@ -0,0 +1,34 @@ +package com.example.matchapi.user.service; + +import com.example.matchcommon.properties.NaverProperties; +import com.example.matchinfrastructure.oauth.naver.client.NaverFeignClient; +import com.example.matchinfrastructure.oauth.naver.client.NaverLoginFeignClient; +import com.example.matchinfrastructure.oauth.naver.dto.NaverTokenRes; +import com.example.matchinfrastructure.oauth.naver.dto.NaverUserInfoDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import static com.example.matchcommon.constants.MatchStatic.BEARER; + +@Service +@RequiredArgsConstructor +public class NaverService { + private final NaverLoginFeignClient naverLoginFeignClient; + private final NaverFeignClient naverFeignClient; + private final NaverProperties naverProperties; + + + public NaverTokenRes getNaverOauthToken(String code){ + return naverLoginFeignClient.naverAuth( + naverProperties.getNaverClientId(), + naverProperties.getNaverClientSecret(), + code + ); + } + + public NaverUserInfoDto getNaverUserInfo(String socialToken){ + return naverFeignClient.getInfo(BEARER + socialToken); + } + + +} diff --git a/Match-Common/src/main/java/com/example/matchcommon/constants/RandomMessageStatic.java b/Match-Common/src/main/java/com/example/matchcommon/constants/RandomMessageStatic.java new file mode 100644 index 00000000..f8271d09 --- /dev/null +++ b/Match-Common/src/main/java/com/example/matchcommon/constants/RandomMessageStatic.java @@ -0,0 +1,26 @@ +package com.example.matchcommon.constants; + +public class RandomMessageStatic { + public static final String CHILDREN_MESSAGE = "난 아이들에게 도움이 될거야"; + + public static final String YOUTH_MESSAGE = "난 청년들에게 도움이 될거야"; + + public static final String WOMEN_MESSAGE = "나는 여성들에게 도움이 될거야"; + + public static final String ELDER_MESSAGE = "나는 어르신분들에게 도움이 될거야"; + + public static final String DISABLED_MESSAGE = "나는 어려운 사람들에게 도움이 될거야."; + + public static final String SOCIAL_MESSAGE = "나는 사회에 도움이 될거야."; + + public static final String EARTH_MESSAGE = "나는 지구촌 이웃에 도움이 될거야."; + + public static final String NEIGHBOR_MESSAGE = "나는 이웃에 도움이 될거야."; + + public static final String ANIMAL_MESSAGE = "나는 아픈 유기견을 치료할테야."; + + public static final String ENVIRONMENT_MESSAGE = "나는 환경을 깨끗하게 만들거야."; + + public static final String RANDOM_MESSAGE = "나는 좋은 불꽃이가 될거야."; + +} diff --git a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/PayMethod.java b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/PayMethod.java index 29df4c80..0270fa57 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/PayMethod.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/donation/entity/enums/PayMethod.java @@ -12,7 +12,8 @@ public enum PayMethod { KAKAO_PAY("kakaopay","카카오 페이"), PAYCO("payco","페이코"), SSGPAY("ssgpay","쓱페이"), - SAMSUNG_PAY("samsungpay","삼성페이"); + SAMSUNG_PAY("samsungpay","삼성페이"), + TUTORIAL("TUTORIAL","튜토리얼"); private final String value; private final String name; diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java index 3d76a72f..a763314e 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/adaptor/ProjectAdaptor.java @@ -140,4 +140,8 @@ public Page findAll(int page, int size) { Pageable pageable = PageRequest.of(page, size); return projectRepository.findByOrderByCreatedAtAsc(pageable); } + + public List getRandom3Project() { + return projectRepository.findRandomThreeProject(LocalDateTime.now()); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java index 505b8a5d..29735e32 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/project/repository/ProjectRepository.java @@ -10,6 +10,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import org.springframework.security.core.parameters.P; import java.time.LocalDateTime; import java.util.List; @@ -334,6 +335,9 @@ Page findTodayProject(@Param("userId") Long userId, @Param("project Page findByOrderByCreatedAtAsc(Pageable pageable); + @Query(value = "SELECT * FROM Project WHERE projectStatus = 'PROCEEDING' and finishedAt > :now and status = 'ACTIVE' ORDER BY RAND() LIMIT 3", nativeQuery = true) + List findRandomThreeProject(@Param("now") LocalDateTime now); + interface ProjectList { Long getId(); diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java b/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java index ab1ba50c..0bdc2f22 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/adaptor/UserAdaptor.java @@ -2,9 +2,11 @@ import com.example.matchcommon.annotation.Adaptor; import com.example.matchcommon.exception.BadRequestException; +import com.example.matchcommon.exception.UnauthorizedException; import com.example.matchdomain.common.model.Status; import com.example.matchdomain.user.entity.User; import com.example.matchdomain.user.entity.enums.SocialType; +import com.example.matchdomain.user.exception.UserAuthErrorCode; import com.example.matchdomain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; @@ -12,6 +14,7 @@ import java.util.Optional; import static com.example.matchdomain.user.entity.enums.Alarm.ACTIVE; +import static com.example.matchdomain.user.entity.enums.SocialType.APPLE; import static com.example.matchdomain.user.entity.enums.SocialType.NORMAL; import static com.example.matchdomain.user.exception.UserLoginErrorCode.NOT_EXIST_USER; @@ -58,4 +61,12 @@ public User save(User user) { public boolean checkEmailPassword(String email, SocialType socialType) { return userRepository.existsByUsernameAndSocialTypeAndStatus(email, socialType, Status.ACTIVE); } + + public boolean existsEmailAndSocial(String email, SocialType socialType){ + return userRepository.existsByEmailAndSocialTypeNotAndStatus(email, socialType, Status.ACTIVE); + } + + public User findByUsernameAndStatus(String username){ + return userRepository.findByUsernameAndStatus(username, Status.ACTIVE).orElseThrow(() -> new UnauthorizedException(UserAuthErrorCode.NOT_EXIST_USER)); + } } diff --git a/Match-Domain/src/main/java/com/example/matchdomain/user/repository/UserRepository.java b/Match-Domain/src/main/java/com/example/matchdomain/user/repository/UserRepository.java index 5851b8ad..74e7456b 100644 --- a/Match-Domain/src/main/java/com/example/matchdomain/user/repository/UserRepository.java +++ b/Match-Domain/src/main/java/com/example/matchdomain/user/repository/UserRepository.java @@ -100,6 +100,8 @@ public interface UserRepository extends JpaRepository { Optional findByUsernameAndStatusAndSocialType(String email, Status status, SocialType socialType); + boolean existsByEmailAndSocialTypeNotAndStatus(String email, SocialType socialType, Status status); + public interface UserList { Long getUserId(); String getName(); diff --git a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java index eaf2e555..54196811 100644 --- a/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java +++ b/Match-Infrastructure/src/main/java/com/example/matchinfrastructure/oauth/apple/service/AppleAuthService.java @@ -84,8 +84,8 @@ public AppleUserRes appleLogin(String identityToken) { checkValidationInfo(iss, aud); - String appleId = userInfoObject.get("sub").getAsString(); - String email = userInfoObject.get("email").getAsString(); + String appleId = String.valueOf(userInfoObject.get("sub")); + String email = String.valueOf(userInfoObject.get("email")); return new AppleUserRes(email, appleId); }