Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature 27/파이어베이스 관리 #28

Merged
merged 3 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: ModernFarmer CI/CD

on:
push:
branches: ["feature_25/유저-정보-조회"]
branches: ["feature_27/파이어베이스-관리"]

pull_request:
branches: ["dev"]
Expand Down
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ dependencies {
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.2'

implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

// firebase sdk
implementation 'com.google.firebase:firebase-admin:6.8.1'
// okhttp
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.2.2'
}

dependencyManagement {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package modernfarmer.server.farmususer.global.config.Firebase;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Builder
@AllArgsConstructor
@Getter
public class FcmMessage {
private boolean validate_only;
private Message message;
@Builder
@AllArgsConstructor
@Getter
public static class Message {

private Notification notification;

private String token;
}
@Builder
@AllArgsConstructor
@Getter
public static class Notification {
private String title;
private String body;
private String image;

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package modernfarmer.server.farmususer.global.config.Firebase;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.auth.oauth2.GoogleCredentials;
import lombok.RequiredArgsConstructor;
import okhttp3.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;

@Component
@RequiredArgsConstructor
public class FirebaseCloudMessageService {

private final String API_URL = "https://fcm.googleapis.com/v1/projects/tourcash-13092/messages:send"; // 프론트에서 제공한 url
private final ObjectMapper objectMapper;

public void sendMessageTo(String targetToken, String title, String body) throws IOException {
String message = makeMessage(targetToken, title, body);
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = RequestBody.create(message, MediaType.get("application/json; charset=utf-8"));
Request request = new Request.Builder()
.url(API_URL)
.post(requestBody)
.addHeader(HttpHeaders.AUTHORIZATION, "Bearer " + getAccessToken())
.addHeader(HttpHeaders.CONTENT_TYPE, "application/json; UTF-8")
.build();
Response response = client.newCall(request)
.execute();

System.out.println(response.body().string());

}
private String makeMessage(String targetToken, String title, String body) throws JsonProcessingException {
FcmMessage fcmMessage = FcmMessage.builder()
.message(FcmMessage.Message.builder()
.token(targetToken)
.notification(FcmMessage.Notification.builder()
.title(title)
.body(body)
.image(null)
.build()
).build()
)
.validate_only(false)
.build();
return objectMapper.writeValueAsString(fcmMessage);
}


private String getAccessToken() throws IOException {
String firebaseConfigPath = "firebase/firebase_service_key.json"; // 프론트에서 받은 파일을 해당 위치에 넣기
GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(new ClassPathResource(firebaseConfigPath).getInputStream())
.createScoped(List.of("https://www.googleapis.com/auth/cloud-platform"));
googleCredentials.refreshIfExpired();
return googleCredentials.getAccessToken().getTokenValue();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package modernfarmer.server.farmususer.user.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import modernfarmer.server.farmususer.user.dto.response.BaseResponseDto;
import modernfarmer.server.farmususer.user.service.FirebaseService;
import modernfarmer.server.farmususer.user.util.JwtTokenProvider;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@Slf4j
@RestController
@RequestMapping("/api/firebase")
@RequiredArgsConstructor
public class FirebaseController {

private final JwtTokenProvider jwtTokenProvider;
private final FirebaseService firebaseService;


@PostMapping(value = "/firebase-token")
public BaseResponseDto insertFirebaseToken(HttpServletRequest request) {

String userId = jwtTokenProvider.getUserId(request);
String fireBaseToken = jwtTokenProvider.getFirebaseToken(request);

return firebaseService.insertFirebaseToken(Long.valueOf(userId),fireBaseToken);
}


@DeleteMapping(value = "/firebase-token")
public BaseResponseDto deleteFirebaseToken(HttpServletRequest request) {

String userId = jwtTokenProvider.getUserId(request);
String fireBaseToken = jwtTokenProvider.getFirebaseToken(request);

return firebaseService.deleteFirebaseToken(Long.valueOf(userId),fireBaseToken);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ public BaseResponseDto allUser() {
@GetMapping(value = "/specific-user")
public BaseResponseDto specificUser(@RequestParam("userId") Long userId) {

// String userId = jwtTokenProvider.getUserId(request);

return userService.specificUser(userId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.time.Instant;
import java.util.LinkedHashSet;
import java.util.Set;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class UserFirebaseToken extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "firebase_token_id", nullable = false)
private Integer id;
private Long id;

@Size(max = 100)
@NotNull
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package modernfarmer.server.farmususer.user.repository;


import io.lettuce.core.dynamic.annotation.Param;
import modernfarmer.server.farmususer.user.entity.User;
import modernfarmer.server.farmususer.user.entity.UserFirebaseToken;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;


@Repository
public interface UserFirebaseTokenRepository extends JpaRepository<UserFirebaseToken, Long> {


@Modifying
@Query("delete from UserFirebaseToken as uf where uf.user = :user and uf.token = :firebaseToken ")
void deleteFirebaseToken(@Param("user") User user, @Param("firebaseToken") String firebaseToken);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package modernfarmer.server.farmususer.user.service;


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import modernfarmer.server.farmususer.global.config.s3.S3Uploader;
import modernfarmer.server.farmususer.global.exception.success.SuccessMessage;
import modernfarmer.server.farmususer.user.dto.response.BaseResponseDto;
import modernfarmer.server.farmususer.user.entity.User;
import modernfarmer.server.farmususer.user.entity.UserFirebaseToken;
import modernfarmer.server.farmususer.user.repository.UserFirebaseTokenRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Transactional
@Slf4j
@Service
public class FirebaseService {

private final UserFirebaseTokenRepository userFirebaseTokenRepository;


public BaseResponseDto insertFirebaseToken(Long userId, String firebaseToken) {


UserFirebaseToken userFirebaseToken = UserFirebaseToken.builder()
.user(User.builder().id(userId).build())
.token(firebaseToken)
.build();

userFirebaseTokenRepository.save(userFirebaseToken);
log.info("파이어 베이스 토큰 삽입 완료");
return BaseResponseDto.of(SuccessMessage.SUCCESS, null);
}

public BaseResponseDto deleteFirebaseToken(Long userId, String firebaseToken) {


userFirebaseTokenRepository.deleteFirebaseToken(
User.builder()
.id(userId)
.build(),
firebaseToken
);

log.info("파이어 베이스 토큰 삭제 완료");

return BaseResponseDto.of(SuccessMessage.SUCCESS, null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,14 @@ public BaseResponseDto reissueToken(String refreshToken, Long userId) {

}









public void deleteValueByKey(String key) {
redisTemplate.delete(key);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,12 @@ public String resolveToken(HttpServletRequest request) {
}
}

public String getUserRole(HttpServletRequest request) {
LOGGER.info("[resolveToken] HTTP 헤더에서 Token 값 추출");
public String getFirebaseToken(HttpServletRequest request) {
LOGGER.info("[firebaseToken] HTTP 헤더에서 Token 값 추출");

String tokenRole = request.getHeader("role");
String firebaseToken = request.getHeader("FirebaseToken");

return tokenRole;
return firebaseToken;

}

Expand Down