Skip to content

Commit

Permalink
PR : Home 화면 기능 수정 및 개선 (#20)
Browse files Browse the repository at this point in the history
* Chore : Home 화면 관련 예외처리 추가

* Chore : Home 화면 관련 비지니스 로직 수정, 의존성 관리

* Chore : 엔티티 컬럼명 수정 writer -> member

* Chore : Jwt 관련 예외 처리 로직 추가
  • Loading branch information
MinsFuture authored Jul 1, 2024
1 parent f0ea957 commit bf2c8f8
Show file tree
Hide file tree
Showing 13 changed files with 227 additions and 90 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

Expand All @@ -27,19 +28,23 @@ public class JwtExceptionHandlerFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (NotValidTokenException e){
HttpStatus httpStatus = e.getErrorCode().getHttpStatus();
String message = e.getErrorCode().getMessage();
} catch (NotValidTokenException e) {
handleException(response, e.getErrorCode().getHttpStatus(), e.getErrorCode().getMessage());
} catch (UsernameNotFoundException e) {
handleException(response, HttpStatus.UNAUTHORIZED, e.getMessage());
}
}

Map<String, Object> jsonResponse = new HashMap<>();
jsonResponse.put("status", httpStatus.value());
jsonResponse.put("message", message);
private void handleException(HttpServletResponse response, HttpStatus status, String message) throws IOException {
Map<String, Object> jsonResponse = new HashMap<>();
jsonResponse.put("status", false);
jsonResponse.put("message", message);
jsonResponse.put("errorCode", status.value());

response.setStatus(httpStatus.value());
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.setStatus(status.value());
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");

objectMapper.writeValue(response.getWriter(), jsonResponse);
}
objectMapper.writeValue(response.getWriter(), jsonResponse);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public class Member {
@OneToMany(mappedBy = "commenter")
private List<Comment> comments = new ArrayList<>();

@OneToMany(mappedBy = "writer")
@OneToMany(mappedBy = "member")
private List<WalkInvitation> walkInvitations = new ArrayList<>();

@Builder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package com.gdsc.petwalk.domain.walkinvitation.controller;

import com.gdsc.petwalk.auth.itself.dto.request.SignUpRequestDto;
import com.gdsc.petwalk.domain.walkinvitation.dto.request.WalkInvitaionCreateRequestDto;
import com.gdsc.petwalk.domain.walkinvitation.dto.request.WalkInvitationCreateRequestDto;
import com.gdsc.petwalk.domain.walkinvitation.dto.response.HomePageResponseDto;
import com.gdsc.petwalk.domain.walkinvitation.dto.response.WalkInvitationDetailsResponseDto;
import com.gdsc.petwalk.domain.walkinvitation.dto.response.WalkInvitationResultDto;
import com.gdsc.petwalk.domain.walkinvitation.service.WalkInvitationService;
import com.gdsc.petwalk.global.principal.PrincipalDetails;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -38,37 +36,53 @@ public class HomeController {
@PreAuthorize("isAuthenticated()")
@Operation(summary = "홈 화면 글쓰기 로직", description = "홈 화면 글쓰기 로직, WalkInvitaionCreateRequestDto는 application/json형식, uploadPhotos는 multipart/form-data로 한번에 form-data 형식으로 보내주면 됨. <br> try it out을 누르면 dto 정보를 확인 할 수 있습니다. swagger에서 직접 테스트는 안되니 참고하세요!")
@ApiResponse(responseCode = "200", description = "글쓰기 성공 시 Long 타입 id 값 반환")
public ResponseEntity<Long> createWalkInvitation(
@RequestPart("walkInvitaionCreateRequestDto") WalkInvitaionCreateRequestDto request,
public ResponseEntity<WalkInvitationResultDto<?>> createWalkInvitation(
@RequestPart("walkInvitationCreateRequestDto") WalkInvitationCreateRequestDto request,
@RequestPart("uploadPhotos") MultipartFile[] multipartFiles,
@AuthenticationPrincipal PrincipalDetails principalDetails){
@AuthenticationPrincipal PrincipalDetails principalDetails) {

Long savedId = walkInvitationService.createWalkInvitation(request, multipartFiles, principalDetails);

return ResponseEntity.ok().body(savedId);
return ResponseEntity.ok().body(WalkInvitationResultDto.builder()
.status(true)
.code(200)
.message("글 등록 성공!")
.data(savedId)
.build());
}

@GetMapping("/{walkInvitationId}")
@Operation(summary = "홈 화면 글 하나 조회 로직", description = "홈 화면 글 하나 조회하는 로직")
@ApiResponse(responseCode = "200", description = "글쓰기 성공 시 WalkInvitationDetailsResponseDto 타입 dto 반환")
public ResponseEntity<WalkInvitationDetailsResponseDto> getDetail(
public ResponseEntity<WalkInvitationResultDto<WalkInvitationDetailsResponseDto>> getDetail(
@PathVariable("walkInvitationId") Long id
){
) {
WalkInvitationDetailsResponseDto response = walkInvitationService.getHomeDetailsById(id);

return ResponseEntity.ok().body(response);
return ResponseEntity.ok().body(WalkInvitationResultDto.<WalkInvitationDetailsResponseDto>builder()
.status(true)
.code(200)
.message("홈 화면 글 상세내용 불러오기 성공!")
.data(response)
.build());
}

@GetMapping("/me")
@PreAuthorize("isAuthenticated()")
@Operation(summary = "홈 화면에 보여질 글들 조회 로직", description = "홈 화면 글들 조회하는 로직이고, 기본은 오늘 하루치만")
@ApiResponse(responseCode = "200", description = "글쓰기 성공 시 HomePageResponseDto 타입 dto 반환")
public ResponseEntity<List<HomePageResponseDto>> getHomepageLists(
@Operation(summary = "홈 화면에 보여질 글들 조회 로직", description = "홈 화면 글들 조회하는 로직이고, 기본은 오늘 하루치만... 추후 글 불러오기 api 필요")
@ApiResponse(responseCode = "200", description = "글쓰기 성공 시 HomePageResponseDto 타입의 list 반환")
public ResponseEntity<WalkInvitationResultDto<List<HomePageResponseDto>>> getHomepageLists(
@AuthenticationPrincipal PrincipalDetails principalDetails
){
) {
List<HomePageResponseDto> homepageLists
= walkInvitationService.getTodayHomePageLists(principalDetails);

return ResponseEntity.ok().body(homepageLists);
return ResponseEntity.ok().body(WalkInvitationResultDto.<List<HomePageResponseDto>>builder()
.status(true)
.code(200)
.message("홈 화면 글 불러오기 성공!")
.data(homepageLists)
.build()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

@Data
public class WalkInvitaionCreateRequestDto {
public class WalkInvitationCreateRequestDto {

private String title;
private String content;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,31 @@
package com.gdsc.petwalk.domain.walkinvitation.dto.response;

import com.gdsc.petwalk.domain.walkinvitation.entity.WalkInvitation;
import com.gdsc.petwalk.domain.walkinvitation.entity.WalkingStatus;
import lombok.Builder;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

@Data
public class HomePageResponseDto {
private Long id; // 글 id
private String title;
private double latitude; // 산책 위치 위도
private double longitude; // 산책 위치 경도
private String detailedLocation; // 세부 위치
private LocalDateTime walkDateTime;
private String walkingStatus; // 산책 상태

private String walkDateTime;
private WalkingStatus walkingStatus; // 산책 상태
private String walkInvitationPhotoUrl; // 썸네일
private String timeDifference; // 몇분 전 올라온 글인지

@Builder
public HomePageResponseDto(String title, double latitude, double longitude, String detailedLocation, LocalDateTime walkDateTime, String walkingStatus, String walkInvitationPhotoUrl) {
public HomePageResponseDto(Long id, String title, double latitude, double longitude, String detailedLocation, String walkDateTime, WalkingStatus walkingStatus, String walkInvitationPhotoUrl, String timeDifference) {
this.id = id;
this.title = title;
this.latitude = latitude;
this.longitude = longitude;
this.detailedLocation = detailedLocation;
this.walkDateTime = walkDateTime;
this.walkingStatus = walkingStatus;
this.walkInvitationPhotoUrl = walkInvitationPhotoUrl;
}


public static List<HomePageResponseDto> getListFrom(List<WalkInvitation> walkInvitations) {

return walkInvitations.stream().map(walkInvitation -> {
return HomePageResponseDto.builder()
.title(walkInvitation.getTitle())
.latitude(walkInvitation.getLatitude())
.longitude(walkInvitation.getLongitude())
.detailedLocation(walkInvitation.getDetailedLocation())
.walkDateTime(walkInvitation.getWalkStartDateTime())
.walkingStatus(walkInvitation.getWalkingStatus())
// .walkInvitationPhotoUrl(walkInvitation.getPhotoUrls().get(0).getPhotoUrl())
.walkInvitationPhotoUrl(null)
.build();
}).toList();
this.timeDifference = timeDifference;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import lombok.Builder;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

@Data
Expand All @@ -14,23 +13,26 @@ public class WalkInvitationDetailsResponseDto {
private double latitude; // 산책 위치 위도
private double longitude; // 산책 위치 경도
private String detailedLocation; // 세부 위치
private LocalDateTime walkDateTime; // 산책 날짜
private String walkDateTime; // 산책 날짜
private String walkingStatus;

private List<String> WalkInvitationPhotoUrls;
private List<String> walkInvitationPhotoUrls;

private Long memberId;
private String memberPhotoUrl;
private String memberName;

@Builder
public WalkInvitationDetailsResponseDto(String title, String content, double latitude, double longitude, String detailedLocation, LocalDateTime walkDateTime, String walkingStatus, List<String> walkInvitationPhotoUrls, String memberPhotoUrl, String memberName) {
public WalkInvitationDetailsResponseDto(String title, String content, double latitude, double longitude, String detailedLocation, String walkDateTime, String walkingStatus, List<String> walkInvitationPhotoUrls, Long memberId, String memberPhotoUrl, String memberName) {
this.title = title;
this.content = content;
this.latitude = latitude;
this.longitude = longitude;
this.detailedLocation = detailedLocation;
this.walkDateTime = walkDateTime;
this.walkingStatus = walkingStatus;
WalkInvitationPhotoUrls = walkInvitationPhotoUrls;
this.walkInvitationPhotoUrls = walkInvitationPhotoUrls;
this.memberId = memberId;
this.memberPhotoUrl = memberPhotoUrl;
this.memberName = memberName;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.gdsc.petwalk.domain.walkinvitation.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
@AllArgsConstructor
public class WalkInvitationResultDto<T> {
private Boolean status;
private int code;
private String message;
private T data;
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,18 +41,19 @@ public class WalkInvitation {
@Column(nullable = false)
private LocalDateTime walkStartDateTime; // 산책 날짜

private String walkingStatus; // 산책 상태
@Enumerated(EnumType.STRING)
private WalkingStatus walkingStatus; // 산책 상태

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member writer; // 게시글 작성자
private Member member; // 게시글 작성자

@Setter
@OneToMany(mappedBy = "walkInvitation", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Photo> photoUrls = new ArrayList<>();

@Builder
public WalkInvitation(Long id, String title, String content, double latitude, double longitude, String detailedLocation, LocalDateTime walkStartDateTime, String walkingStatus, Member writer, List<Photo> photoUrls) {
public WalkInvitation(Long id, String title, String content, double latitude, double longitude, String detailedLocation, LocalDateTime walkStartDateTime, WalkingStatus walkingStatus, Member member, List<Photo> photoUrls) {
this.id = id;
this.title = title;
this.content = content;
Expand All @@ -61,7 +62,7 @@ public WalkInvitation(Long id, String title, String content, double latitude, do
this.detailedLocation = detailedLocation;
this.walkStartDateTime = walkStartDateTime;
this.walkingStatus = walkingStatus;
this.writer = writer;
this.member = member;
this.photoUrls = photoUrls;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.gdsc.petwalk.domain.walkinvitation.entity;

public enum WalkingStatus {
BEFORE_WALK, DURING_WALK, AFTER_WALK
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.util.List;

public interface WalkInvitationRepository extends JpaRepository<WalkInvitation, Long> {
List<WalkInvitation> findAllByWriter(Member member);
List<WalkInvitation> findAllByMember(Member member);

List<WalkInvitation> findAllByWalkStartDateTimeBetween(LocalDateTime start, LocalDateTime end);

Expand Down
Loading

0 comments on commit bf2c8f8

Please sign in to comment.