Skip to content

Commit

Permalink
Merge pull request #142 from UMC5th-bias/develop
Browse files Browse the repository at this point in the history
[DEPLOY] main <- develop 배포
  • Loading branch information
JungYoonShin committed Sep 4, 2024
2 parents 396641d + 749b512 commit 25a159b
Show file tree
Hide file tree
Showing 35 changed files with 1,062 additions and 68 deletions.
5 changes: 5 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,18 @@ dependencies {
implementation 'org.springframework.cloud:spring-cloud-gcp-starter-storage:1.2.8.RELEASE'
implementation 'net.coobird:thumbnailator:0.4.14'

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

// STOMP
implementation 'org.webjars:webjars-locator-core'
implementation 'org.webjars:sockjs-client:1.5.1'
implementation 'org.webjars:stomp-websocket:2.3.4'

// jackson 날짜/시간 직렬화
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'

}

tasks.named('bootBuildImage') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.favoriteplace.app.controller;

import com.favoriteplace.app.service.fcm.FCMNotificationService;
import com.favoriteplace.app.service.fcm.dto.PostTokenCond;
import com.favoriteplace.app.service.fcm.enums.TokenMessage;
import com.favoriteplace.app.service.fcm.enums.TotalTopicMessage;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/fcm")
@RequiredArgsConstructor
public class FCMNotificationController {
private final FCMNotificationService fcmNotificationService;

@PostMapping("/token")
public String sendNotificationByToken(
@RequestParam String token
){
return fcmNotificationService.sendNotificationByToken(PostTokenCond.builder()
.token(token).postId(1L).tokenMessage(TokenMessage.POST_NEW_COMMENT).message("댓글 내용")
.build());
}

@PostMapping("/topic/subscribe")
public String subScribeTopic(
@RequestParam String token
){
fcmNotificationService.subscribeTopic("total", token);
return "토픽에 정상적으로 등록 완료";
}

@PostMapping("/topic/send")
public String sendAlarmByTopic(

){
return fcmNotificationService.sendTotalAlarmByTopic(TotalTopicMessage.INFORM);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.parameters.P;
import org.springframework.web.bind.annotation.*;

import java.util.List;
Expand Down Expand Up @@ -51,13 +52,22 @@ public ResponseEntity<PostResponseDto.SuccessResponseDto> createGuestBookComment
){
Member member = securityUtil.getUser();
// Member member = memberRepository.findById(1L).orElseThrow(() -> new RestApiException(ErrorCode.USER_NOT_FOUND));
commentCommandService.createGuestBookComment(member, guestbookId, guestBookCommentDto);
Long commentId = commentCommandService.createGuestBookComment(member, guestbookId, guestBookCommentDto);
return new ResponseEntity<>(
PostResponseDto.SuccessResponseDto.builder().message("댓글이 성공적으로 등록했습니다.").build(),
PostResponseDto.SuccessResponseDto.builder().commentId(commentId).message("댓글이 성공적으로 등록했습니다.").build(),
HttpStatus.OK
);
}

@PostMapping("/{guestbook_id}/comments/{comment_id}/notification")
public ResponseEntity<?> sendGuestBookNotification(
@PathVariable("guestbook_id") Long guestbookId,
@PathVariable("comment_id") Long commentId
){
commentCommandService.sendGuestBookNotification(guestbookId, commentId);
return ResponseEntity.ok().build();
}

@PutMapping("/comments/{comment_id}")
public ResponseEntity<PostResponseDto.SuccessResponseDto> modifyGuestBookComment(
@PathVariable("comment_id") Long commentId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
import com.favoriteplace.app.domain.Member;
import com.favoriteplace.app.dto.CommonResponseDto;
import com.favoriteplace.app.dto.MyPageDto;
import com.favoriteplace.app.dto.MyPageDto.MyFcmTokenDto;
import com.favoriteplace.app.dto.community.CommentResponseDto;
import com.favoriteplace.app.service.MyPageCommandService;
import com.favoriteplace.app.service.MyPageQueryService;
import com.favoriteplace.global.util.SecurityUtil;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
Expand Down Expand Up @@ -84,4 +87,14 @@ public MyPageDto.MyModifyBlockDto modifyMemberBlock(
Member member = securityUtil.getUser();
return myPageCommandService.modifyMemberBlock(member, blockedMember);
}

//FCM token 등록 & 변경
@PatchMapping("/fcmToken")
public ResponseEntity<?> modifyFcmToken(
@Valid @RequestBody MyFcmTokenDto request
){
Member member = securityUtil.getUser();
myPageCommandService.modifyFcmToken(member, request);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.favoriteplace.app.controller;

import com.favoriteplace.app.domain.Member;
import com.favoriteplace.app.dto.NotificationResponseDto;
import com.favoriteplace.app.service.NotificationService;
import com.favoriteplace.global.util.SecurityUtil;
import jakarta.validation.constraints.Min;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/notifications")
@RequiredArgsConstructor
@Validated
public class NotificationController {
private final NotificationService notificationService;
private final SecurityUtil securityUtil;

// 알림 전체 조회
@GetMapping()
public ResponseEntity<NotificationResponseDto> getAllNotification(
@Min(value = 1, message = "page는 1 이상입니다.") @RequestParam(required = false, defaultValue = "1") Integer page,
@Min(value = 1, message = "size는 1 이상입니다.") @RequestParam(required = false, defaultValue = "1") Integer size
){
Member member = securityUtil.getUser();
NotificationResponseDto response = notificationService.getAllNotification(member, page, size);
return ResponseEntity.ok(response);
}

// 알림 한번에 다 읽음 처리
@PatchMapping()
public ResponseEntity<?> readAllNotification(){
Member member = securityUtil.getUser();
notificationService.readAllNotification(member);
return ResponseEntity.noContent().build();
}

// 특정 알림 읽음 처리
@PatchMapping("/{notificationId}")
public ResponseEntity<?> readNotification(
@PathVariable Long notificationId
){
Member member = securityUtil.getUser();
notificationService.readNotification(notificationId, member);
return ResponseEntity.noContent().build();
}

// 특정 알림 삭제
@DeleteMapping("/{notificationId}")
public ResponseEntity<?> deleteNotification(
@PathVariable Long notificationId
){
Member member = securityUtil.getUser();
notificationService.deleteNotification(notificationId, member);
return ResponseEntity.noContent().build();
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.favoriteplace.app.controller;

import com.favoriteplace.app.domain.Member;
import com.favoriteplace.app.domain.travel.Rally;
import com.favoriteplace.app.dto.CommonResponseDto;
import com.favoriteplace.app.dto.community.GuestBookRequestDto;
import com.favoriteplace.app.dto.community.PostResponseDto;
import com.favoriteplace.app.dto.travel.PilgrimageDto;
import com.favoriteplace.app.dto.travel.RallyDto;
import com.favoriteplace.app.service.PilgrimageCommandService;
Expand All @@ -15,12 +12,9 @@
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

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

@RestController
Expand Down Expand Up @@ -107,6 +101,22 @@ public CommonResponseDto.PostResponseDto likeToRally(@PathVariable("rally_id")Lo
return pilgrimageCommandService.likeToRally(rallyId, member);
}

// 랠리 FCM 구독
@PostMapping("/{rally_id}/subscribe")
public ResponseEntity<?> subscribeRally(@PathVariable("rally_id") Long rallyId){
Member member = securityUtil.getUser();
pilgrimageCommandService.subscribeRally(rallyId, member);
return ResponseEntity.ok().build();
}

// 랠리 FCM 구독 취소
@DeleteMapping("/{rally_id}/unsubscribe")
public ResponseEntity<?> unsubscribeRally(@PathVariable("rally_id") Long rallyId){
Member member = securityUtil.getUser();
pilgrimageCommandService.unsubscribeRally(rallyId, member);
return ResponseEntity.noContent().build();
}

// 성지순례 장소 방문 인증하기
// @PostMapping("/certified/{pilgrimage_id}")
// public CommonResponseDto.RallyResponseDto certifyToPilgrimage(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,48 +24,50 @@ public class PilgrimageSocketController {
private final PilgrimageCommandService pilgrimageService;

/**
* 위도/경도 전달 시 상태 변경 알리는 컨트롤러
* 최초 접근버튼 상태 전달하는 컨트롤러
*
* 요청 컨트롤러 /app/location/{pilgrimageId}
* 응답 컨트롤러 /pub/statusUpdate/{pilgrimageId}
* 요청 컨트롤러 /app/connect/{pilgrimageId}
* 응답 컨트롤러 /pub/statusUpdate/{pilgrimageId}
*
* @param pilgrimageId 성지순례 ID
* @param userLocation 위도/경도
* @return 버튼 상태 json
* @return
*/
@MessageMapping("/location/{pilgrimageId}")
@MessageMapping("/connect/{pilgrimageId}")
@SendTo("/pub/statusUpdate/{pilgrimageId}")
public PilgrimageSocketDto.ButtonState checkUserLocation(@DestinationVariable Long pilgrimageId, Principal principal, PilgrimageDto.PilgrimageCertifyRequestDto userLocation) {
public PilgrimageSocketDto.ButtonState sendInitialStatus(@DestinationVariable Long pilgrimageId, Principal principal) {
if (principal == null)
throw new RestApiException(ErrorCode.USER_NOT_AUTHOR);

CustomUserDetails userDetails = (CustomUserDetails)
((UsernamePasswordAuthenticationToken) principal).getPrincipal();
Member member = userDetails.getMember();

return pilgrimageService.buttonStatusUpdate(pilgrimageId, userLocation, member);
PilgrimageSocketDto.ButtonState buttonState = pilgrimageService.initButton(member, pilgrimageId);
return buttonState;
}

/**
* 최초 접근버튼 상태 전달하는 컨트롤러
* 위도/경도 전달 시 상태 변경 알리는 컨트롤러
*
* 요청 컨트롤러 /app/connect/{pilgrimageId}
* 응답 컨트롤러 /pub/statusUpdate/{pilgrimageId}
* 요청 컨트롤러 /app/location/{pilgrimageId}
* 응답 컨트롤러 /pub/statusUpdate/{pilgrimageId}
*
* @param pilgrimageId 성지순례 ID
* @return
* @param userLocation 위도/경도
* @return 버튼 상태 json
*/
@MessageMapping("/connect/{pilgrimageId}")
@MessageMapping("/location/{pilgrimageId}")
@SendTo("/pub/statusUpdate/{pilgrimageId}")
public PilgrimageSocketDto.ButtonState sendInitialStatus(@DestinationVariable Long pilgrimageId, Principal principal) {
public PilgrimageSocketDto.ButtonState checkUserLocation(@DestinationVariable Long pilgrimageId, Principal principal, PilgrimageDto.PilgrimageCertifyRequestDto userLocation) {
if (principal == null)
throw new RestApiException(ErrorCode.USER_NOT_AUTHOR);

CustomUserDetails userDetails = (CustomUserDetails)
((UsernamePasswordAuthenticationToken) principal).getPrincipal();
Member member = userDetails.getMember();

return pilgrimageService.determineButtonState(member, pilgrimageId);
PilgrimageSocketDto.ButtonState buttonState = pilgrimageService.buttonStatusUpdate(pilgrimageId, userLocation, member);
return buttonState;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

import java.util.List;

import static com.favoriteplace.app.dto.community.PostResponseDto.*;

@RestController
@RequestMapping("/posts/free")
@RequiredArgsConstructor
Expand All @@ -29,7 +31,7 @@ public class PostCommentController {
private final MemberRepository memberRepository;

@GetMapping("/my-comments")
public ResponseEntity<PostResponseDto.MyCommentDto> getMyComments(
public ResponseEntity<MyCommentDto> getMyComments(
@RequestParam(required = false, defaultValue = "1") int page,
@RequestParam(required = false, defaultValue = "10") int size
){
Expand All @@ -50,42 +52,51 @@ public ResponseEntity<CommentResponseDto.CommentDto> getPostComments(
}

@PostMapping("/{post_id}/comments")
public ResponseEntity<PostResponseDto.SuccessResponseDto> createPostComment(
@PathVariable("post_id") long postId,
public ResponseEntity<SuccessResponseDto> createPostComment(
@PathVariable("post_id") Long postId,
@RequestBody CommentRequestDto.CreateComment dto
){
Member member = securityUtil.getUser();
// Member member = memberRepository.findById(1L).orElseThrow(() -> new RestApiException(ErrorCode.USER_NOT_FOUND));
commentCommandService.createPostComment(member, postId, dto);
Long commentId = commentCommandService.createPostComment(member, postId, dto);
return new ResponseEntity<>(
PostResponseDto.SuccessResponseDto.builder().message("댓글을 성공적으로 등록했습니다.").build(),
SuccessResponseDto.builder().commentId(commentId).message("댓글을 성공적으로 등록했습니다.").build(),
HttpStatus.OK
);
}

@PostMapping("/{post_id}/comments/{comment_id}/notification")
public ResponseEntity<?> sendPostNotification(
@PathVariable("post_id") long postId,
@PathVariable("comment_id") long commentId
){
commentCommandService.sendPostNotification(postId, commentId);
return ResponseEntity.ok().build();
}

@PutMapping("/comments/{comment_id}")
public ResponseEntity<PostResponseDto.SuccessResponseDto> modifyPostComment(
public ResponseEntity<SuccessResponseDto> modifyPostComment(
@PathVariable("comment_id") long commentId,
@RequestBody CommentRequestDto.ModifyComment dto
){
Member member = securityUtil.getUser();
// Member member = memberRepository.findById(1L).orElseThrow(() -> new RestApiException(ErrorCode.USER_NOT_FOUND));
commentCommandService.modifyComment(member, commentId, dto.getContent());
return new ResponseEntity<>(
PostResponseDto.SuccessResponseDto.builder().message("댓글을 성공적으로 수정했습니다.").build(),
SuccessResponseDto.builder().message("댓글을 성공적으로 수정했습니다.").build(),
HttpStatus.OK
);
}

@DeleteMapping("/comments/{comment_id}")
public ResponseEntity<PostResponseDto.SuccessResponseDto> deletePostComment(
public ResponseEntity<SuccessResponseDto> deletePostComment(
@PathVariable("comment_id") long commentId
){
Member member = securityUtil.getUser();
// Member member = memberRepository.findById(1L).orElseThrow(() -> new RestApiException(ErrorCode.USER_NOT_FOUND));
commentCommandService.deleteComment(member, commentId);
return new ResponseEntity<>(
PostResponseDto.SuccessResponseDto.builder().message("댓글을 성공적으로 삭제했습니다.").build(),
SuccessResponseDto.builder().message("댓글을 성공적으로 삭제했습니다.").build(),
HttpStatus.OK
);
}
Expand Down
Loading

0 comments on commit 25a159b

Please sign in to comment.