From e06ece90d9cb332d9042ffbe67a4da3f9242a19c Mon Sep 17 00:00:00 2001 From: okod Date: Mon, 10 Jun 2024 06:29:25 +0900 Subject: [PATCH 1/9] feature: sendFcmMessage Service --- .../spring/domain/webpush/FcmController.java | 1 + .../vom/spring/domain/webpush/FcmService.java | 6 ++--- .../spring/domain/webpush/FcmServiceImpl.java | 24 ++++++++++++++----- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/vom/spring/domain/webpush/FcmController.java b/src/main/java/vom/spring/domain/webpush/FcmController.java index 14daa5e..0c77b9a 100644 --- a/src/main/java/vom/spring/domain/webpush/FcmController.java +++ b/src/main/java/vom/spring/domain/webpush/FcmController.java @@ -32,6 +32,7 @@ public ResponseEntity> pushMessage(@RequestBody @Vali .resultCode(SuccessCode.SELECT_SUCCESS.getStatus()) .resultMsg(SuccessCode.SELECT_SUCCESS.getMessage()) .build(); + return new ResponseEntity<>(arw, HttpStatus.OK); } } diff --git a/src/main/java/vom/spring/domain/webpush/FcmService.java b/src/main/java/vom/spring/domain/webpush/FcmService.java index 78637c4..d067d58 100644 --- a/src/main/java/vom/spring/domain/webpush/FcmService.java +++ b/src/main/java/vom/spring/domain/webpush/FcmService.java @@ -5,8 +5,6 @@ import java.io.IOException; @Service -public class FcmService { - int sendMessageTo(FcmSendDto fcmSendDto) throws IOException { - return 0; - } +public interface FcmService { + int sendMessageTo(FcmSendDto fcmSendDto) throws IOException; } diff --git a/src/main/java/vom/spring/domain/webpush/FcmServiceImpl.java b/src/main/java/vom/spring/domain/webpush/FcmServiceImpl.java index 8dca721..26e2910 100644 --- a/src/main/java/vom/spring/domain/webpush/FcmServiceImpl.java +++ b/src/main/java/vom/spring/domain/webpush/FcmServiceImpl.java @@ -3,14 +3,18 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.auth.oauth2.GoogleCredentials; +import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.ClassPathResource; import org.springframework.http.*; +import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.io.IOException; import java.util.List; -public class FcmServiceImpl extends FcmService { +@Slf4j +@Service +public class FcmServiceImpl implements FcmService { /** * 푸시 메시지 처리를 수행하는 비즈니스 로직 * @@ -24,17 +28,25 @@ public int sendMessageTo(FcmSendDto fcmSendDto) throws IOException { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); - headers.set("Content-Type", "application/json"); + headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", "Bearer " + getAccessToken()); HttpEntity entity = new HttpEntity<>(message, headers); String API_URL = "https://fcm.googleapis.com/v1/projects/vomvom-fd09b/messages:send"; // String API_URL = "https://fcm.googleapis.com/fcm/send"; - - ResponseEntity response = restTemplate.exchange(API_URL, HttpMethod.POST, entity, String.class); - - return response.getStatusCode() == HttpStatus.OK ? 1 : 0; + ResponseEntity response = null; + + try { + response = restTemplate.exchange(API_URL, HttpMethod.POST, entity, String.class); + System.out.println(response.getStatusCode()); + return response.getStatusCode() == HttpStatus.OK ? 1 : 0; + } catch (Exception e) { + log.error("[-] FCM 전송 오류 :: " + e.getMessage()); + log.error("[-] 오류 발생 토큰 :: [" + fcmSendDto.getToken() + "]"); + log.error("[-] 오류 발생 메시지 :: [" + fcmSendDto.getBody() + "]"); + return 0; + } } /** From 390626e4e86afd50e576b8762429b07140ecd4ad Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 02:06:23 +0900 Subject: [PATCH 2/9] refactor: folder structure --- .../spring/domain/webpush/FcmController.java | 38 ---------- .../vom/spring/domain/webpush/FcmService.java | 10 --- .../webpush/{ => domain}/SuccessCode.java | 2 +- .../webpush/{ => dto}/ApiResponseWrapper.java | 2 +- .../webpush/{ => dto}/FcmMessageDto.java | 2 +- .../domain/webpush/{ => dto}/FcmSendDto.java | 2 +- .../FcmService.java} | 71 +++++++++++++++---- 7 files changed, 63 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/vom/spring/domain/webpush/FcmController.java delete mode 100644 src/main/java/vom/spring/domain/webpush/FcmService.java rename src/main/java/vom/spring/domain/webpush/{ => domain}/SuccessCode.java (92%) rename src/main/java/vom/spring/domain/webpush/{ => dto}/ApiResponseWrapper.java (96%) rename src/main/java/vom/spring/domain/webpush/{ => dto}/FcmMessageDto.java (93%) rename src/main/java/vom/spring/domain/webpush/{ => dto}/FcmSendDto.java (90%) rename src/main/java/vom/spring/domain/webpush/{FcmServiceImpl.java => service/FcmService.java} (55%) diff --git a/src/main/java/vom/spring/domain/webpush/FcmController.java b/src/main/java/vom/spring/domain/webpush/FcmController.java deleted file mode 100644 index 0c77b9a..0000000 --- a/src/main/java/vom/spring/domain/webpush/FcmController.java +++ /dev/null @@ -1,38 +0,0 @@ -package vom.spring.domain.webpush; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; - -@Slf4j -@RestController -@RequestMapping("/api/v1/fcm") -public class FcmController { - private final FcmService fcmService; - - public FcmController(FcmService fcmService) { - this.fcmService = fcmService; - } - - @PostMapping("/send") - public ResponseEntity> pushMessage(@RequestBody @Validated FcmSendDto fcmSendDto) throws IOException, IOException { - log.debug("[+] 푸시 메시지를 전송합니다. "); - int result = fcmService.sendMessageTo(fcmSendDto); - - ApiResponseWrapper arw = ApiResponseWrapper - .builder() - .result(result) - .resultCode(SuccessCode.SELECT_SUCCESS.getStatus()) - .resultMsg(SuccessCode.SELECT_SUCCESS.getMessage()) - .build(); - - return new ResponseEntity<>(arw, HttpStatus.OK); - } -} diff --git a/src/main/java/vom/spring/domain/webpush/FcmService.java b/src/main/java/vom/spring/domain/webpush/FcmService.java deleted file mode 100644 index d067d58..0000000 --- a/src/main/java/vom/spring/domain/webpush/FcmService.java +++ /dev/null @@ -1,10 +0,0 @@ -package vom.spring.domain.webpush; - -import org.springframework.stereotype.Service; - -import java.io.IOException; - -@Service -public interface FcmService { - int sendMessageTo(FcmSendDto fcmSendDto) throws IOException; -} diff --git a/src/main/java/vom/spring/domain/webpush/SuccessCode.java b/src/main/java/vom/spring/domain/webpush/domain/SuccessCode.java similarity index 92% rename from src/main/java/vom/spring/domain/webpush/SuccessCode.java rename to src/main/java/vom/spring/domain/webpush/domain/SuccessCode.java index 60dbdd1..d2967af 100644 --- a/src/main/java/vom/spring/domain/webpush/SuccessCode.java +++ b/src/main/java/vom/spring/domain/webpush/domain/SuccessCode.java @@ -1,4 +1,4 @@ -package vom.spring.domain.webpush; +package vom.spring.domain.webpush.domain; public enum SuccessCode { SELECT_SUCCESS(200, "데이터 조회 성공"), diff --git a/src/main/java/vom/spring/domain/webpush/ApiResponseWrapper.java b/src/main/java/vom/spring/domain/webpush/dto/ApiResponseWrapper.java similarity index 96% rename from src/main/java/vom/spring/domain/webpush/ApiResponseWrapper.java rename to src/main/java/vom/spring/domain/webpush/dto/ApiResponseWrapper.java index ce768a9..0638206 100644 --- a/src/main/java/vom/spring/domain/webpush/ApiResponseWrapper.java +++ b/src/main/java/vom/spring/domain/webpush/dto/ApiResponseWrapper.java @@ -1,4 +1,4 @@ -package vom.spring.domain.webpush; +package vom.spring.domain.webpush.dto; import lombok.Getter; diff --git a/src/main/java/vom/spring/domain/webpush/FcmMessageDto.java b/src/main/java/vom/spring/domain/webpush/dto/FcmMessageDto.java similarity index 93% rename from src/main/java/vom/spring/domain/webpush/FcmMessageDto.java rename to src/main/java/vom/spring/domain/webpush/dto/FcmMessageDto.java index ba57327..a93d0c2 100644 --- a/src/main/java/vom/spring/domain/webpush/FcmMessageDto.java +++ b/src/main/java/vom/spring/domain/webpush/dto/FcmMessageDto.java @@ -1,4 +1,4 @@ -package vom.spring.domain.webpush; +package vom.spring.domain.webpush.dto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/vom/spring/domain/webpush/FcmSendDto.java b/src/main/java/vom/spring/domain/webpush/dto/FcmSendDto.java similarity index 90% rename from src/main/java/vom/spring/domain/webpush/FcmSendDto.java rename to src/main/java/vom/spring/domain/webpush/dto/FcmSendDto.java index 3c2fc27..f807994 100644 --- a/src/main/java/vom/spring/domain/webpush/FcmSendDto.java +++ b/src/main/java/vom/spring/domain/webpush/dto/FcmSendDto.java @@ -1,4 +1,4 @@ -package vom.spring.domain.webpush; +package vom.spring.domain.webpush.dto; import lombok.*; diff --git a/src/main/java/vom/spring/domain/webpush/FcmServiceImpl.java b/src/main/java/vom/spring/domain/webpush/service/FcmService.java similarity index 55% rename from src/main/java/vom/spring/domain/webpush/FcmServiceImpl.java rename to src/main/java/vom/spring/domain/webpush/service/FcmService.java index 26e2910..8aed14d 100644 --- a/src/main/java/vom/spring/domain/webpush/FcmServiceImpl.java +++ b/src/main/java/vom/spring/domain/webpush/service/FcmService.java @@ -4,27 +4,67 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.auth.oauth2.GoogleCredentials; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.http.*; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; +import vom.spring.domain.member.domain.Member; +import vom.spring.domain.member.repository.MemberRepository; +import vom.spring.domain.webpush.domain.Fcm; +import vom.spring.domain.webpush.repository.FcmRepository; import java.io.IOException; +import java.time.LocalDateTime; import java.util.List; @Slf4j @Service -public class FcmServiceImpl implements FcmService { +public class FcmService { + private final FcmRepository fcmRepository; + private final MemberRepository memberRepository; + + @Autowired + public FcmService(FcmRepository fcmRepository, MemberRepository memberRepository) { + this.fcmRepository = fcmRepository; + this.memberRepository = memberRepository; + } + + /** + * Fcm Token 저장 + */ + @Transactional + public void setFcmToken(String fcmToken, Long member_id) { + + Member member = memberRepository.findById(member_id).get(); + + + System.out.println(fcmToken); + System.out.println(member_id); + fcmRepository.save( + Fcm.builder() + .createdAt(LocalDateTime.now()) + .fcmToken(fcmToken) + .member(member) + .build() + ); + } + /** * 푸시 메시지 처리를 수행하는 비즈니스 로직 * - * @param fcmSendDto 모바일에서 전달받은 Object +// * @param fcmSendDto 모바일에서 전달받은 Object * @return 성공(1), 실패(0) */ - @Override - public int sendMessageTo(FcmSendDto fcmSendDto) throws IOException { +// public int sendMessageTo(FcmSendDto fcmSendDto) throws IOException { + public int sendMessageTo(Long memberId) throws IOException { + + System.out.println("1111111111"); - String message = makeMessage(fcmSendDto); +// String message = makeMessage(fcmSendDto); + String message = makeMessage(memberId); + System.out.println("22222222"); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); @@ -43,8 +83,8 @@ public int sendMessageTo(FcmSendDto fcmSendDto) throws IOException { return response.getStatusCode() == HttpStatus.OK ? 1 : 0; } catch (Exception e) { log.error("[-] FCM 전송 오류 :: " + e.getMessage()); - log.error("[-] 오류 발생 토큰 :: [" + fcmSendDto.getToken() + "]"); - log.error("[-] 오류 발생 메시지 :: [" + fcmSendDto.getBody() + "]"); +// log.error("[-] 오류 발생 토큰 :: [" + fcmSendDto.getToken() + "]"); +// log.error("[-] 오류 발생 메시지 :: [" + fcmSendDto.getBody() + "]"); return 0; } } @@ -57,6 +97,8 @@ public int sendMessageTo(FcmSendDto fcmSendDto) throws IOException { * @return Bearer token */ private String getAccessToken() throws IOException { + + System.out.println("woooooooooooooooowwwww"); String firebaseConfigPath = "firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json"; GoogleCredentials googleCredentials = GoogleCredentials @@ -73,18 +115,23 @@ private String getAccessToken() throws IOException { /** * FCM 전송 정보를 기반으로 메시지를 구성합니다. (Object -> String) * - * @param fcmSendDto FcmSendDto +// * @param fcmSendDto FcmSendDto * @return String */ - private String makeMessage(FcmSendDto fcmSendDto) throws JsonProcessingException { +// private String makeMessage(FcmSendDto fcmSendDto) throws JsonProcessingException { + private String makeMessage(Long memberId) throws JsonProcessingException { ObjectMapper om = new ObjectMapper(); + Fcm fcm = fcmRepository.findByMember_id(memberId); + + System.out.println(fcm.getId()); + FcmMessageDto fcmMessageDto = FcmMessageDto.builder() .message(FcmMessageDto.Message.builder() - .token(fcmSendDto.getToken()) + .token(fcm.getFcmToken()) .notification(FcmMessageDto.Notification.builder() - .title(fcmSendDto.getTitle()) - .body(fcmSendDto.getBody()) + .title("테스트") + .body("테스트입니다용") .image(null) .build() ).build()).validateOnly(false).build(); From 7660a7881e0db65bbe44a6615bc8ff98a7598cd5 Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 02:19:31 +0900 Subject: [PATCH 3/9] feat: Add Fcm Domain --- .../spring/domain/member/domain/Member.java | 4 +++ .../vom/spring/domain/webpush/domain/Fcm.java | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/vom/spring/domain/webpush/domain/Fcm.java diff --git a/src/main/java/vom/spring/domain/member/domain/Member.java b/src/main/java/vom/spring/domain/member/domain/Member.java index 379640f..a81a659 100644 --- a/src/main/java/vom/spring/domain/member/domain/Member.java +++ b/src/main/java/vom/spring/domain/member/domain/Member.java @@ -5,6 +5,7 @@ import lombok.*; import vom.spring.domain.homepy.Homepy; import vom.spring.domain.touchpoint.Touchpoint; +import vom.spring.domain.webpush.domain.Fcm; import java.time.LocalDate; import java.util.ArrayList; @@ -39,6 +40,9 @@ public class Member { @OneToOne(mappedBy = "member", fetch = LAZY) private Homepy homepy; + @OneToOne(mappedBy = "member", fetch = LAZY) + private Fcm fcm; + public void updateNicknameAndEmailAndProfileImg(String nickname, String email, String profileImgUrl) { this.nickname = nickname; diff --git a/src/main/java/vom/spring/domain/webpush/domain/Fcm.java b/src/main/java/vom/spring/domain/webpush/domain/Fcm.java new file mode 100644 index 0000000..333af7b --- /dev/null +++ b/src/main/java/vom/spring/domain/webpush/domain/Fcm.java @@ -0,0 +1,32 @@ +package vom.spring.domain.webpush.domain; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import vom.spring.domain.member.domain.Member; + +import java.time.LocalDateTime; + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Fcm { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @Column(nullable = false) + private String fcmToken; + + @OneToOne + @JoinColumn(referencedColumnName = "id", name = "member_id", nullable = false) + private Member member; +} From 76bbd2f982ef90c136906adfc664e8d45ffb437f Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 02:23:12 +0900 Subject: [PATCH 4/9] feat: Add Fcm Repository --- .../webpush/repository/FcmRepository.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/vom/spring/domain/webpush/repository/FcmRepository.java diff --git a/src/main/java/vom/spring/domain/webpush/repository/FcmRepository.java b/src/main/java/vom/spring/domain/webpush/repository/FcmRepository.java new file mode 100644 index 0000000..5e07305 --- /dev/null +++ b/src/main/java/vom/spring/domain/webpush/repository/FcmRepository.java @@ -0,0 +1,28 @@ +package vom.spring.domain.webpush.repository; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.NoResultException; +import jakarta.persistence.PersistenceContext; +import org.springframework.stereotype.Repository; +import vom.spring.domain.webpush.domain.Fcm; + +@Repository +public class FcmRepository { + + @PersistenceContext + private EntityManager em; + + public void save(Fcm fcm) { + em.persist(fcm); + } + + public Fcm findByMember_id(Long member_id) { + try { + return em.createQuery("SELECT f FROM Fcm f WHERE f.member.id = :member_id", Fcm.class) + .setParameter("member_id", member_id) + .getSingleResult(); + } catch (NoResultException e) { + return null; + } + } +} From 9bdbfbb9b0643308ba9f59b158b597dcf8dfe420 Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 02:31:36 +0900 Subject: [PATCH 5/9] feat: Add Fcm Service --- .../domain/webpush/service/FcmService.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/src/main/java/vom/spring/domain/webpush/service/FcmService.java b/src/main/java/vom/spring/domain/webpush/service/FcmService.java index 8aed14d..26e36d4 100644 --- a/src/main/java/vom/spring/domain/webpush/service/FcmService.java +++ b/src/main/java/vom/spring/domain/webpush/service/FcmService.java @@ -1,4 +1,4 @@ -package vom.spring.domain.webpush; +package vom.spring.domain.webpush.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -12,6 +12,7 @@ import org.springframework.web.client.RestTemplate; import vom.spring.domain.member.domain.Member; import vom.spring.domain.member.repository.MemberRepository; +import vom.spring.domain.webpush.dto.FcmMessageDto; import vom.spring.domain.webpush.domain.Fcm; import vom.spring.domain.webpush.repository.FcmRepository; @@ -39,9 +40,6 @@ public void setFcmToken(String fcmToken, Long member_id) { Member member = memberRepository.findById(member_id).get(); - - System.out.println(fcmToken); - System.out.println(member_id); fcmRepository.save( Fcm.builder() .createdAt(LocalDateTime.now()) @@ -54,17 +52,11 @@ public void setFcmToken(String fcmToken, Long member_id) { /** * 푸시 메시지 처리를 수행하는 비즈니스 로직 * -// * @param fcmSendDto 모바일에서 전달받은 Object * @return 성공(1), 실패(0) */ -// public int sendMessageTo(FcmSendDto fcmSendDto) throws IOException { public int sendMessageTo(Long memberId) throws IOException { - System.out.println("1111111111"); - -// String message = makeMessage(fcmSendDto); String message = makeMessage(memberId); - System.out.println("22222222"); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); @@ -83,8 +75,6 @@ public int sendMessageTo(Long memberId) throws IOException { return response.getStatusCode() == HttpStatus.OK ? 1 : 0; } catch (Exception e) { log.error("[-] FCM 전송 오류 :: " + e.getMessage()); -// log.error("[-] 오류 발생 토큰 :: [" + fcmSendDto.getToken() + "]"); -// log.error("[-] 오류 발생 메시지 :: [" + fcmSendDto.getBody() + "]"); return 0; } } @@ -98,7 +88,6 @@ public int sendMessageTo(Long memberId) throws IOException { */ private String getAccessToken() throws IOException { - System.out.println("woooooooooooooooowwwww"); String firebaseConfigPath = "firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json"; GoogleCredentials googleCredentials = GoogleCredentials @@ -113,18 +102,19 @@ private String getAccessToken() throws IOException { } /** - * FCM 전송 정보를 기반으로 메시지를 구성합니다. (Object -> String) + * FCM 전송 정보를 기반으로 메시지를 구성합니다. * -// * @param fcmSendDto FcmSendDto * @return String */ -// private String makeMessage(FcmSendDto fcmSendDto) throws JsonProcessingException { private String makeMessage(Long memberId) throws JsonProcessingException { ObjectMapper om = new ObjectMapper(); Fcm fcm = fcmRepository.findByMember_id(memberId); - System.out.println(fcm.getId()); + if (fcm == null) { + log.error("Fcm token not found for memberId: " + memberId); + throw new IllegalArgumentException("Fcm token not found for memberId: " + memberId); + } FcmMessageDto fcmMessageDto = FcmMessageDto.builder() .message(FcmMessageDto.Message.builder() From 174ace377aec11d3d0432cf92f03824713a7b554 Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 02:36:03 +0900 Subject: [PATCH 6/9] feat: Add Fcm Controller --- .../webpush/controller/FcmController.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/main/java/vom/spring/domain/webpush/controller/FcmController.java diff --git a/src/main/java/vom/spring/domain/webpush/controller/FcmController.java b/src/main/java/vom/spring/domain/webpush/controller/FcmController.java new file mode 100644 index 0000000..6ba8e8f --- /dev/null +++ b/src/main/java/vom/spring/domain/webpush/controller/FcmController.java @@ -0,0 +1,51 @@ +package vom.spring.domain.webpush.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import vom.spring.domain.webpush.dto.ApiResponseWrapper; +import vom.spring.domain.webpush.service.FcmService; +import vom.spring.domain.webpush.domain.SuccessCode; + +import java.io.IOException; + +@Slf4j +@Controller +public class FcmController { + private FcmService fcmService; + @Autowired + public FcmController(FcmService fcmService) { + this.fcmService = fcmService; + } + + @PostMapping(value = "/api/fcm/{member-id}") + public ResponseEntity setFcmToken( + @PathVariable("member-id") Long member_id, + @RequestParam String fcmToken + ) { + fcmService.setFcmToken(fcmToken, member_id); + return new ResponseEntity<>(HttpStatus.OK); + } + + // 웹 푸시 서비스 테스트용 + @PostMapping("/api/v2/fcm/send/{member_id}") + public ResponseEntity> pushMessage( + @PathVariable("member_id") Long memberId + ) throws IOException { + log.debug("[+] 푸시 메시지를 전송합니다. "); + + int result = fcmService.sendMessageTo(memberId); + + ApiResponseWrapper arw = ApiResponseWrapper + .builder() + .result(result) + .resultCode(SuccessCode.SELECT_SUCCESS.getStatus()) + .resultMsg(SuccessCode.SELECT_SUCCESS.getMessage()) + .build(); + + return new ResponseEntity<>(arw, HttpStatus.OK); + } +} From edd4f1f2a0c8dc34df967e5a31a67a089e07dbae Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 03:26:51 +0900 Subject: [PATCH 7/9] feat: Create Firebase Admin SDK JSON file to workflow --- .github/workflows/deploy.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f648a60..ae373fc 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -54,6 +54,12 @@ jobs: oauth2.google.token-uri: ${{ secrets.TOKEN_URI }} oauth2.google.resource-uri: ${{ secrets.RESOURCE_URI }} jwt.secret: ${{ secrets.JWT_SECRET }} + # 2-2) Create Firebase Admin SDK JSON file + - name: Create Firebase Admin SDK JSON file + env: + FIREBASE_ADMIN_SDK: ${{ secrets.FIREBASE_ADMIN_SDK }} + run: | + echo "$FIREBASE_ADMIN_SDK" > /firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json # 3) gradlew 권한 설정 - name: Grant execute permission for gradlew run: chmod +x gradlew From ff937628bc438db8c30a0fc1b210a948bc601515 Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 03:42:26 +0900 Subject: [PATCH 8/9] feat: Add FIREBASE_CONFIG_PATH to github actions workflow --- .github/workflows/deploy.yml | 4 ++++ .../java/vom/spring/domain/webpush/service/FcmService.java | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ae373fc..53bb0cf 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -58,7 +58,9 @@ jobs: - name: Create Firebase Admin SDK JSON file env: FIREBASE_ADMIN_SDK: ${{ secrets.FIREBASE_ADMIN_SDK }} + FIREBASE_CONFIG_PATH: /firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json run: | + mkdir -p /firebase echo "$FIREBASE_ADMIN_SDK" > /firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json # 3) gradlew 권한 설정 - name: Grant execute permission for gradlew @@ -67,6 +69,8 @@ jobs: # 4) test 제외 gradle 빌드 - name: Build with Gradle run: ./gradlew clean build -x test + env: + FIREBASE_CONFIG_PATH: /firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json # working-directory: ${{ env.working-directory }} # 5) AWS 인증 - name: Configure AWS credentials diff --git a/src/main/java/vom/spring/domain/webpush/service/FcmService.java b/src/main/java/vom/spring/domain/webpush/service/FcmService.java index 26e36d4..44463bf 100644 --- a/src/main/java/vom/spring/domain/webpush/service/FcmService.java +++ b/src/main/java/vom/spring/domain/webpush/service/FcmService.java @@ -88,7 +88,10 @@ public int sendMessageTo(Long memberId) throws IOException { */ private String getAccessToken() throws IOException { - String firebaseConfigPath = "firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json"; + String firebaseConfigPath = System.getenv("FIREBASE_CONFIG_PATH"); + if (firebaseConfigPath == null) { + firebaseConfigPath = "firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json"; + } GoogleCredentials googleCredentials = GoogleCredentials .fromStream(new ClassPathResource(firebaseConfigPath).getInputStream()) From edca701b35b943643da95442702c4e1bb35216bd Mon Sep 17 00:00:00 2001 From: okod Date: Tue, 11 Jun 2024 03:46:28 +0900 Subject: [PATCH 9/9] fix: FIREBASE_CONFIG_PATH --- .github/workflows/deploy.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 53bb0cf..cd2a252 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -60,8 +60,8 @@ jobs: FIREBASE_ADMIN_SDK: ${{ secrets.FIREBASE_ADMIN_SDK }} FIREBASE_CONFIG_PATH: /firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json run: | - mkdir -p /firebase - echo "$FIREBASE_ADMIN_SDK" > /firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json + mkdir -p firebase + echo "$FIREBASE_ADMIN_SDK" > firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json # 3) gradlew 권한 설정 - name: Grant execute permission for gradlew run: chmod +x gradlew @@ -70,7 +70,7 @@ jobs: - name: Build with Gradle run: ./gradlew clean build -x test env: - FIREBASE_CONFIG_PATH: /firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json + FIREBASE_CONFIG_PATH: firebase/vomvom-fd09b-firebase-adminsdk-ghtjs-0070b39a4e.json # working-directory: ${{ env.working-directory }} # 5) AWS 인증 - name: Configure AWS credentials