Skip to content

Commit

Permalink
[FEAT/#108] fcm 토큰 저장, 수정, 조회, 삭제 기능 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
mingsound21 committed Jan 30, 2023
1 parent d032f4c commit ee2f2cd
Show file tree
Hide file tree
Showing 11 changed files with 242 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.modugarden.domain.fcm.controller;


import com.modugarden.common.response.BaseResponseDto;
import com.modugarden.domain.auth.entity.ModugardenUser;
import com.modugarden.domain.fcm.dto.request.AddFcmTokenRequestDto;
import com.modugarden.domain.fcm.dto.request.DeleteFcmTokenRequestDto;
import com.modugarden.domain.fcm.dto.request.UpdateFcmTokenRequestDto;
import com.modugarden.domain.fcm.dto.response.AddFcmTokenResponseDto;
import com.modugarden.domain.fcm.dto.response.DeleteFcmTokenResponseDto;
import com.modugarden.domain.fcm.dto.response.GetAllFcmTokenResponseDto;
import com.modugarden.domain.fcm.dto.response.UpdateFcmTokenResponseDto;
import com.modugarden.domain.fcm.service.FcmService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RequiredArgsConstructor
@RestController
@RequestMapping("/fcm")
public class FcmController {

private final FcmService fcmService;

@PostMapping()
public BaseResponseDto<AddFcmTokenResponseDto> addFcmToken(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody @Valid AddFcmTokenRequestDto requestDto){
AddFcmTokenResponseDto responseDto = fcmService.addFcmToken(requestDto, modugardenUser.getUser());
return new BaseResponseDto<>(responseDto);
}

@PatchMapping
public BaseResponseDto<UpdateFcmTokenResponseDto> updateFcmToken(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody @Valid UpdateFcmTokenRequestDto requestDto){
UpdateFcmTokenResponseDto responseDto = fcmService.updateFcmToken(requestDto);
return new BaseResponseDto(responseDto);
}

@GetMapping
public BaseResponseDto<GetAllFcmTokenResponseDto> getFcmTokens(@AuthenticationPrincipal ModugardenUser modugardenUser){
GetAllFcmTokenResponseDto fcmTokens = fcmService.getFcmTokens(modugardenUser.getUser());
return new BaseResponseDto<>(fcmTokens);
}

@DeleteMapping
public BaseResponseDto<DeleteFcmTokenResponseDto> deleteFcmToken(@AuthenticationPrincipal ModugardenUser modugardenUser, @RequestBody @Valid DeleteFcmTokenRequestDto requestDto){
DeleteFcmTokenResponseDto responseDto = fcmService.deleteFcmToken(requestDto);
return new BaseResponseDto(responseDto);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.modugarden.domain.fcm.dto.request;

import lombok.Getter;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Getter
public class AddFcmTokenRequestDto {
@NotBlank(message = "추가할 fcm 토큰은 필수 입력 값입니다.")
private String fcmToken;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.modugarden.domain.fcm.dto.request;

import lombok.Getter;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Getter
public class DeleteFcmTokenRequestDto {
@NotBlank(message = "삭제할 fcm 토큰은 필수 입력 값입니다.")
private String fcmToken;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.modugarden.domain.fcm.dto.request;

import lombok.Getter;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

@Getter
public class UpdateFcmTokenRequestDto {
@NotBlank(message = "수정 전 fcm 토큰은 필수 입력 값입니다.")
private String beforeFcmToken;
@NotBlank(message = "수정 후 fcm 토큰은 필수 입력 값입니다.")
private String updateFcmToken;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.modugarden.domain.fcm.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class AddFcmTokenResponseDto {
private String fcmToken;
private Long userId; // 유저 관련해서 무슨 정보가 필요한가?? 여쭤볼것
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.modugarden.domain.fcm.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class DeleteFcmTokenResponseDto {
private String fcmToken;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.modugarden.domain.fcm.dto.response;

import com.modugarden.domain.fcm.entity.FcmToken;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

@Getter
@AllArgsConstructor
public class GetAllFcmTokenResponseDto {
List<String> fcmTokens;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.modugarden.domain.fcm.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class UpdateFcmTokenResponseDto {
private String fcmToken;
}
35 changes: 35 additions & 0 deletions src/main/java/com/modugarden/domain/fcm/entity/FcmToken.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.modugarden.domain.fcm.entity;

import com.modugarden.domain.user.entity.User;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class FcmToken {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String fcmToken;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;

public FcmToken(String fcmToken, User user) {
this.fcmToken = fcmToken;
this.user = user;
}

public void update(String fcmToken){
this.fcmToken = fcmToken;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.modugarden.domain.fcm.repository;

import com.modugarden.domain.fcm.entity.FcmToken;
import com.modugarden.domain.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;

public interface FcmRepository extends JpaRepository<FcmToken, Long> {

List<FcmToken> findByUser(User user);
Optional<FcmToken> findByFcmToken(String fcmToken);

Optional<FcmToken> deleteByFcmToken(String fcmToken);
}
59 changes: 59 additions & 0 deletions src/main/java/com/modugarden/domain/fcm/service/FcmService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.modugarden.domain.fcm.service;

import com.modugarden.common.error.exception.custom.BusinessException;
import com.modugarden.domain.fcm.dto.request.AddFcmTokenRequestDto;
import com.modugarden.domain.fcm.dto.request.DeleteFcmTokenRequestDto;
import com.modugarden.domain.fcm.dto.request.UpdateFcmTokenRequestDto;
import com.modugarden.domain.fcm.dto.response.AddFcmTokenResponseDto;
import com.modugarden.domain.fcm.dto.response.DeleteFcmTokenResponseDto;
import com.modugarden.domain.fcm.dto.response.GetAllFcmTokenResponseDto;
import com.modugarden.domain.fcm.dto.response.UpdateFcmTokenResponseDto;
import com.modugarden.domain.fcm.entity.FcmToken;
import com.modugarden.domain.fcm.repository.FcmRepository;
import com.modugarden.domain.user.entity.User;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static com.modugarden.common.error.enums.ErrorMessage.FCM_TOKEN_NOT_FOUND;

@RequiredArgsConstructor
@Transactional
@Service
public class FcmService {

private final FcmRepository fcmRepository;

public AddFcmTokenResponseDto addFcmToken(AddFcmTokenRequestDto requestDto, User user){
FcmToken newFcmToken = new FcmToken(requestDto.getFcmToken(), user);
fcmRepository.save(newFcmToken);

return new AddFcmTokenResponseDto(newFcmToken.getFcmToken(), user.getId());
}

public UpdateFcmTokenResponseDto updateFcmToken(UpdateFcmTokenRequestDto requestDto){
FcmToken fcmToken = fcmRepository.findByFcmToken(requestDto.getBeforeFcmToken()).orElseThrow(() -> new BusinessException(FCM_TOKEN_NOT_FOUND));
fcmToken.update(requestDto.getUpdateFcmToken());

return new UpdateFcmTokenResponseDto(requestDto.getUpdateFcmToken());
}

public DeleteFcmTokenResponseDto deleteFcmToken(DeleteFcmTokenRequestDto requestDto){
FcmToken fcmToken = fcmRepository.findByFcmToken(requestDto.getFcmToken()).orElseThrow(() -> new BusinessException(FCM_TOKEN_NOT_FOUND));
fcmRepository.delete(fcmToken);

return new DeleteFcmTokenResponseDto(fcmToken.getFcmToken());
}

public GetAllFcmTokenResponseDto getFcmTokens(User user){
List<FcmToken> fcmTokens = fcmRepository.findByUser(user);
List<String> result = fcmTokens.stream().map(fcm -> fcm.getFcmToken()).collect(Collectors.toList());

return new GetAllFcmTokenResponseDto(result);
}
}

0 comments on commit ee2f2cd

Please sign in to comment.