From c16b6110c7275a9637b27719eeb9ea0555affa21 Mon Sep 17 00:00:00 2001 From: jeanniejang Date: Wed, 24 Aug 2022 13:33:18 +0900 Subject: [PATCH 01/14] =?UTF-8?q?[#20]=20Feat:=20Post=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=20Swagger=20API=20=EB=AA=85=EC=84=B8=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=20=EC=84=A4=EC=A0=95=20-Post=20Controller=20?= =?UTF-8?q?-Post=20=EA=B4=80=EB=A0=A8=20Dto=EB=93=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inssagram/controller/PostController.java | 9 ++++++--- .../java/com/clonecode/inssagram/domain/Image.java | 2 +- .../inssagram/dto/response/PostAllResponseDto.java | 12 ++++++++++++ .../dto/response/PostCreateResponseDto.java | 6 +++--- .../dto/response/PostDetailResponseDto.java | 11 ++++++++++- .../dto/response/PostUpdateResponseDto.java | 2 ++ .../dto/response/UserProfileResponseDto.java | 4 ++++ 7 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/clonecode/inssagram/controller/PostController.java b/src/main/java/com/clonecode/inssagram/controller/PostController.java index 2222fc2..a646531 100644 --- a/src/main/java/com/clonecode/inssagram/controller/PostController.java +++ b/src/main/java/com/clonecode/inssagram/controller/PostController.java @@ -10,15 +10,18 @@ import com.clonecode.inssagram.global.error.ErrorCode; import com.clonecode.inssagram.jwt.TokenProvider; import com.clonecode.inssagram.service.PostService; +import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; +@Api(tags = {"게시물 API Controller"}) @RestController @RequestMapping("/api/posts") @RequiredArgsConstructor @@ -27,10 +30,10 @@ public class PostController { private final TokenProvider tokenProvider; @ApiOperation(value = "게시물 작성", notes = "게시물 작성 기능", response = PostCreateResponseDto.class) - @PostMapping() + @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}) public ResponseEntity createPost( - PostRequestDto requestDto, - List imageFileList) { + @RequestPart PostRequestDto requestDto, + @RequestPart List imageFileList) { User user = tokenProvider.getUserFromAuthentication(); if (imageFileList == null) { diff --git a/src/main/java/com/clonecode/inssagram/domain/Image.java b/src/main/java/com/clonecode/inssagram/domain/Image.java index ce0bcee..82569b6 100644 --- a/src/main/java/com/clonecode/inssagram/domain/Image.java +++ b/src/main/java/com/clonecode/inssagram/domain/Image.java @@ -15,7 +15,7 @@ public class Image { private Long id; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn (name = "postId") + @JoinColumn (name = "postId", nullable = false) private Post post; @NotNull diff --git a/src/main/java/com/clonecode/inssagram/dto/response/PostAllResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/PostAllResponseDto.java index 6a53cd1..6118a8b 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/PostAllResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/PostAllResponseDto.java @@ -3,6 +3,7 @@ import com.clonecode.inssagram.domain.Image; import com.clonecode.inssagram.domain.Post; import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; import lombok.Builder; import lombok.Getter; @@ -12,13 +13,23 @@ @Getter public class PostAllResponseDto { + @ApiModelProperty(example = "게시물 DB Id") private Long postId; + @ApiModelProperty(example = "게시물 작성자 정보") private UserProfileResponseDto user; + @ApiModelProperty(example = "게시물 글 내용") private String postContents; + @ApiModelProperty(example = "게시물 사진 URL") private List imageUrlList; + @ApiModelProperty(example = "게시물 하트 수") private Long heartNum; + @ApiModelProperty(example = "게시물 댓글 수") private Long commentNum; + @ApiModelProperty(example = "로그인한 사용자의 게시물 하트 여부") private Long isHeart; + @ApiModelProperty(example = "게시물 댓글 목록") + private List commentList; + @ApiModelProperty(example = "게시물 생성일자") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime createdAt; @@ -28,6 +39,7 @@ public PostAllResponseDto(Post post, Long heartNum, Long commentNum, Long isHear this.user = new UserProfileResponseDto(post.getUser()); this.postContents = post.getPostContents(); this.imageUrlList = post.getImageList().stream().map(Image::getImageUrl).collect(Collectors.toList()); + this.commentList = post.getCommentList().stream().map(CommentResponseDto::new).limit(2).collect(Collectors.toList()); this.createdAt = post.getCreatedAt(); this.heartNum = heartNum; this.commentNum = commentNum; diff --git a/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java index 97eaad4..c3ce922 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java @@ -10,13 +10,13 @@ @Getter public class PostCreateResponseDto { - @ApiModelProperty(example = "게시물 Id") + @ApiModelProperty(example = "게시물 DB Id") @NotBlank private Long id; - @ApiModelProperty(example = "사진 url") + @ApiModelProperty(example = "게시물 사진 URL") @NotBlank private String imageUrl; - @ApiModelProperty(example = "게시물 좋아요 수") + @ApiModelProperty(example = "게시물 하트 수") @NotBlank private Long heartNum; @ApiModelProperty(example = "게시물 댓글 수") diff --git a/src/main/java/com/clonecode/inssagram/dto/response/PostDetailResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/PostDetailResponseDto.java index 3d99919..3735343 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/PostDetailResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/PostDetailResponseDto.java @@ -3,6 +3,7 @@ import com.clonecode.inssagram.domain.Image; import com.clonecode.inssagram.domain.Post; import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; import lombok.Builder; import lombok.Getter; @@ -12,16 +13,24 @@ @Getter public class PostDetailResponseDto { + @ApiModelProperty(example = "게시물 DB Id") private Long postId; + @ApiModelProperty(example = "게시물 작성자 정보") private UserProfileResponseDto user; + @ApiModelProperty(example = "게시물 글 내용") private String postContents; + @ApiModelProperty(example = "게시물 사진 URL") private List imageUrlList; + @ApiModelProperty(example = "게시물 하트 수") private Long heartNum; + @ApiModelProperty(example = "게시물 댓글 수") private Long commentNum; + @ApiModelProperty(example = "로그인한 사용자의 게시물 하트 여부") private Long isHeart; + @ApiModelProperty(example = "게시물 생성일자") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime createdAt; - + @ApiModelProperty(example = "게시물 댓글 목록") private List commentList; @Builder diff --git a/src/main/java/com/clonecode/inssagram/dto/response/PostUpdateResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/PostUpdateResponseDto.java index e25d7a8..64e7f21 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/PostUpdateResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/PostUpdateResponseDto.java @@ -1,10 +1,12 @@ package com.clonecode.inssagram.dto.response; import com.clonecode.inssagram.domain.Post; +import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @Getter public class PostUpdateResponseDto { + @ApiModelProperty(example = "게시물 글 내용") private String postContents; public PostUpdateResponseDto(Post post){ diff --git a/src/main/java/com/clonecode/inssagram/dto/response/UserProfileResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/UserProfileResponseDto.java index 95b8050..49123d5 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/UserProfileResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/UserProfileResponseDto.java @@ -1,12 +1,16 @@ package com.clonecode.inssagram.dto.response; import com.clonecode.inssagram.domain.User; +import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @Getter public class UserProfileResponseDto { + @ApiModelProperty(example = "사용자 DB Id") private Long userId; + @ApiModelProperty(example = "사용자 이름(별명)") private String username; + @ApiModelProperty(example = "사용자 프로필 사진 URL") private String profileImageUrl; From d375d350944b68bf59515ff9061499c71512c5c0 Mon Sep 17 00:00:00 2001 From: jeanniejang Date: Wed, 24 Aug 2022 13:36:33 +0900 Subject: [PATCH 02/14] =?UTF-8?q?[#20]=20Feat:=20PostCreateResponseDto=20f?= =?UTF-8?q?ield=20name=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inssagram/dto/response/PostCreateResponseDto.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java index c3ce922..8aebc5c 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/PostCreateResponseDto.java @@ -12,7 +12,7 @@ public class PostCreateResponseDto { @ApiModelProperty(example = "게시물 DB Id") @NotBlank - private Long id; + private Long postId; @ApiModelProperty(example = "게시물 사진 URL") @NotBlank private String imageUrl; @@ -25,7 +25,7 @@ public class PostCreateResponseDto { @Builder public PostCreateResponseDto(Post post, String imageUrl, Long heartNum, Long commentNum){ - this.id = post.getId(); + this.postId = post.getId(); this.imageUrl = imageUrl; this.heartNum = heartNum; this.commentNum = commentNum; From c8d0f49e2c2f1214e288a6d55b8c963df1c4c22b Mon Sep 17 00:00:00 2001 From: Moveuk Date: Wed, 24 Aug 2022 13:49:24 +0900 Subject: [PATCH 03/14] =?UTF-8?q?[#22]Fix:=20=EC=8A=A4=EC=9B=A8=EA=B1=B0?= =?UTF-8?q?=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EA=B8=B0=EB=B3=B8=20example=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clonecode/inssagram/dto/request/LoginRequestDto.java | 4 ++-- .../clonecode/inssagram/dto/request/SignUpRequestDto.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/clonecode/inssagram/dto/request/LoginRequestDto.java b/src/main/java/com/clonecode/inssagram/dto/request/LoginRequestDto.java index b9452ca..fd340ed 100644 --- a/src/main/java/com/clonecode/inssagram/dto/request/LoginRequestDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/request/LoginRequestDto.java @@ -13,11 +13,11 @@ public class LoginRequestDto { @NotBlank - @ApiModelProperty(example = "사용자 이메일") + @ApiModelProperty(example = "tester@inssa.com") private String email; @NotBlank - @ApiModelProperty(example = "사용자 비밀번호") + @ApiModelProperty(example = "1234") private String password; } diff --git a/src/main/java/com/clonecode/inssagram/dto/request/SignUpRequestDto.java b/src/main/java/com/clonecode/inssagram/dto/request/SignUpRequestDto.java index 9f5121b..13ac793 100644 --- a/src/main/java/com/clonecode/inssagram/dto/request/SignUpRequestDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/request/SignUpRequestDto.java @@ -25,17 +25,17 @@ public class SignUpRequestDto { @NotBlank @Size(min = 4, max = 12) @Pattern(regexp = "[a-zA-Z\\d]*${3,12}") - @ApiModelProperty(example = "사용자 이름(별명)") + @ApiModelProperty(example = "tester@inssa.com") private String username; //영어 소문자, 숫자 4~32자리 @NotBlank @Size(min = 4, max = 32) @Pattern(regexp = "[a-z\\d]*${3,32}") - @ApiModelProperty(example = "사용자 비밀번호") + @ApiModelProperty(example = "1234") private String password; @NotBlank - @ApiModelProperty(example = "사용자 비밀번호 확인") + @ApiModelProperty(example = "1234") private String passwordCheck; } From dc38c64295e4158b99ee556051215cdc2b8231b1 Mon Sep 17 00:00:00 2001 From: jeanniejang Date: Wed, 24 Aug 2022 14:05:56 +0900 Subject: [PATCH 04/14] =?UTF-8?q?[#1]=20Feat:=20=EA=B2=8C=EC=8B=9C?= =?UTF-8?q?=EB=AC=BC=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20HttpStatus=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20-FOUND=EB=A1=9C=20=EB=90=98=EC=96=B4?= =?UTF-8?q?=EC=9E=88=EB=8D=98=20=EA=B1=B8=20OK=EB=A1=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/clonecode/inssagram/controller/PostController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/clonecode/inssagram/controller/PostController.java b/src/main/java/com/clonecode/inssagram/controller/PostController.java index a646531..c64a9f5 100644 --- a/src/main/java/com/clonecode/inssagram/controller/PostController.java +++ b/src/main/java/com/clonecode/inssagram/controller/PostController.java @@ -48,7 +48,7 @@ public ResponseEntity getPosts() { if (tokenProvider.getUserFromAuthentication() == null) { throw new InvalidValueException(ErrorCode.LOGIN_REQUIRED); } - return new ResponseEntity<>(postService.getAllPosts(), HttpStatus.valueOf(HttpStatus.FOUND.value())); + return new ResponseEntity<>(postService.getAllPosts(), HttpStatus.valueOf(HttpStatus.OK.value())); } @ApiOperation(value = "상세 게시물 조회", notes = "상세 게시물 조회 기능", response = PostDetailResponseDto.class) @@ -57,7 +57,7 @@ public ResponseEntity getPost(@PathVariable Long postId) { if (tokenProvider.getUserFromAuthentication() == null) { throw new InvalidValueException(ErrorCode.LOGIN_REQUIRED); } - return new ResponseEntity<>(postService.getOnePost(postId), HttpStatus.valueOf(HttpStatus.FOUND.value())); + return new ResponseEntity<>(postService.getOnePost(postId), HttpStatus.valueOf(HttpStatus.OK.value())); } @ApiOperation(value = "게시물 수정", notes = "게시물 수정 기능", response = PostUpdateResponseDto.class) From 5758f8a0f55795d2653de598ae6cb55e399f8498 Mon Sep 17 00:00:00 2001 From: HASEUNGHEEE Date: Wed, 24 Aug 2022 15:06:14 +0900 Subject: [PATCH 05/14] =?UTF-8?q?[#18]=20feat:=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MyPageController.java | 28 +++++++++ .../com/clonecode/inssagram/domain/Post.java | 3 +- .../dto/response/MyPageResponseDto.java | 35 +++++++++++ .../UserDetailProfileResponseDto.java | 26 ++++++++ .../inssagram/repository/PostRepository.java | 7 +++ .../inssagram/service/HeartService.java | 14 +++++ .../inssagram/service/PostService.java | 62 ++++++++++++++----- 7 files changed, 160 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/clonecode/inssagram/controller/MyPageController.java create mode 100644 src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java create mode 100644 src/main/java/com/clonecode/inssagram/dto/response/UserDetailProfileResponseDto.java diff --git a/src/main/java/com/clonecode/inssagram/controller/MyPageController.java b/src/main/java/com/clonecode/inssagram/controller/MyPageController.java new file mode 100644 index 0000000..4eb1c77 --- /dev/null +++ b/src/main/java/com/clonecode/inssagram/controller/MyPageController.java @@ -0,0 +1,28 @@ +package com.clonecode.inssagram.controller; + +import com.clonecode.inssagram.dto.response.MyPageResponseDto; +import com.clonecode.inssagram.service.PostService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +@Api(tags = {"마이페이지 API Controller"}) +@RestController +@RequestMapping("/api/users") +@RequiredArgsConstructor +public class MyPageController { + private final PostService postService; + + @ApiOperation(value = "마이페이지 조회", notes = "마이페이지 조회 기능", response = MyPageResponseDto.class) + @RequestMapping(value = "/{userId}", method = RequestMethod.GET) + public ResponseEntity getMyPage(@PathVariable(name = "userId") Long userId) { + return new ResponseEntity<>( + postService.getMyPage(userId), + HttpStatus.valueOf(HttpStatus.OK.value())); + } +} diff --git a/src/main/java/com/clonecode/inssagram/domain/Post.java b/src/main/java/com/clonecode/inssagram/domain/Post.java index 307d44d..9ef5bf7 100644 --- a/src/main/java/com/clonecode/inssagram/domain/Post.java +++ b/src/main/java/com/clonecode/inssagram/domain/Post.java @@ -34,9 +34,10 @@ public class Post extends Timestamped { @Column private Long heartNum; - public Post(User user, PostRequestDto postRequestDto) { + public Post(User user, PostRequestDto postRequestDto, Long heartNum) { this.user = user; this.postContents = postRequestDto.getPostContents(); + this.heartNum = heartNum; } public void update(PostRequestDto requestDto){ diff --git a/src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java new file mode 100644 index 0000000..ab33877 --- /dev/null +++ b/src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java @@ -0,0 +1,35 @@ +package com.clonecode.inssagram.dto.response; + +import com.clonecode.inssagram.domain.User; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +@Getter +public class MyPageResponseDto { + + @ApiModelProperty(example = "사용자 정보") + private UserDetailProfileResponseDto user; + + @ApiModelProperty(example = "사용자가 작성한 총 게시글 수") + private Long postTotalNum; + + @ApiModelProperty(example = "사용자가 받은 총 하트 수") + private Long heartTotalNum; + + @ApiModelProperty(example = "사용자가 작성한 게시글 목록록") + private List contentList; + + @Builder + public MyPageResponseDto(User user, Long postTotalNum, Long heartTotalNum, + List contentList) { + this.user = new UserDetailProfileResponseDto(user); + this.postTotalNum = postTotalNum; + this.heartTotalNum = heartTotalNum; + this.contentList = contentList; + } + + +} diff --git a/src/main/java/com/clonecode/inssagram/dto/response/UserDetailProfileResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/UserDetailProfileResponseDto.java new file mode 100644 index 0000000..595ef35 --- /dev/null +++ b/src/main/java/com/clonecode/inssagram/dto/response/UserDetailProfileResponseDto.java @@ -0,0 +1,26 @@ +package com.clonecode.inssagram.dto.response; + +import com.clonecode.inssagram.domain.User; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; + +@Getter +public class UserDetailProfileResponseDto { + + @ApiModelProperty(example = "사용자 DB Id") + private Long userId; + @ApiModelProperty(example = "사용자 이름") + private String username; + @ApiModelProperty(example = "사용자 프로필 사진 URL") + private String profileImageUrl; + @ApiModelProperty(example = "사용자 자기소개") + private String intro; + + public UserDetailProfileResponseDto(User user) { + this.userId = user.getId(); + this.username = user.getUsername(); + this.profileImageUrl = user.getProfileImageUrl(); + this.intro = user.getIntro(); + } + +} diff --git a/src/main/java/com/clonecode/inssagram/repository/PostRepository.java b/src/main/java/com/clonecode/inssagram/repository/PostRepository.java index ab6dc85..dc6762c 100644 --- a/src/main/java/com/clonecode/inssagram/repository/PostRepository.java +++ b/src/main/java/com/clonecode/inssagram/repository/PostRepository.java @@ -1,6 +1,7 @@ package com.clonecode.inssagram.repository; import com.clonecode.inssagram.domain.Post; +import com.clonecode.inssagram.domain.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; @@ -8,4 +9,10 @@ public interface PostRepository extends JpaRepository { List findAllByOrderByCreatedAtDesc(); + List findAllByUserOrderByCreatedAtDesc(User user); + + Long countByUserId(Long userId); + Post findByUserId(Long userId); + + List findAllByUserId(Long userId); } diff --git a/src/main/java/com/clonecode/inssagram/service/HeartService.java b/src/main/java/com/clonecode/inssagram/service/HeartService.java index 90b9191..8df5e89 100644 --- a/src/main/java/com/clonecode/inssagram/service/HeartService.java +++ b/src/main/java/com/clonecode/inssagram/service/HeartService.java @@ -12,10 +12,12 @@ import com.clonecode.inssagram.jwt.TokenProvider; import com.clonecode.inssagram.repository.HeartRepository; import com.clonecode.inssagram.repository.PostRepository; +import com.clonecode.inssagram.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import javax.transaction.Transactional; +import java.util.List; import java.util.Optional; @Service @@ -23,6 +25,7 @@ public class HeartService { private final HeartRepository heartRepository; private final PostRepository postRepository; + private final UserRepository userRepository; private final TokenProvider tokenProvider; @@ -89,4 +92,15 @@ public Long isHeart(Long postId, User user) { } + + public Long totalHeartsByUser(Long userId) { + User user = userRepository.findById(userId). orElseThrow( + () -> new EntityNotFoundException(ErrorCode.USER_NOT_FOUND)); + List postList = postRepository.findAllByUserId(userId); + + Long heartTotalNum = postList.stream().mapToLong(Post::getHeartNum).sum(); + + return heartTotalNum; + } + } diff --git a/src/main/java/com/clonecode/inssagram/service/PostService.java b/src/main/java/com/clonecode/inssagram/service/PostService.java index e970c62..738ce24 100644 --- a/src/main/java/com/clonecode/inssagram/service/PostService.java +++ b/src/main/java/com/clonecode/inssagram/service/PostService.java @@ -1,17 +1,15 @@ package com.clonecode.inssagram.service; -import com.clonecode.inssagram.domain.*; -import com.clonecode.inssagram.dto.request.HeartRequestDto; +import com.clonecode.inssagram.domain.Image; +import com.clonecode.inssagram.domain.Post; +import com.clonecode.inssagram.domain.User; import com.clonecode.inssagram.dto.request.PostRequestDto; import com.clonecode.inssagram.dto.response.*; import com.clonecode.inssagram.exception.EntityNotFoundException; import com.clonecode.inssagram.exception.InvalidValueException; import com.clonecode.inssagram.global.error.ErrorCode; import com.clonecode.inssagram.jwt.TokenProvider; -import com.clonecode.inssagram.repository.CommentRepository; -import com.clonecode.inssagram.repository.HeartRepository; -import com.clonecode.inssagram.repository.ImageRepository; -import com.clonecode.inssagram.repository.PostRepository; +import com.clonecode.inssagram.repository.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -30,14 +28,15 @@ public class PostService { private final StorageService storageService; private final HeartService heartService; private final TokenProvider tokenProvider; + private final UserRepository userRepository; private final HeartRepository heartRepository; @Transactional public ResponseDto writePost(User user, PostRequestDto requestDto, List imageFileList) { List imageUrlList = storageService.uploadFile(imageFileList, "posts/"); //이미지 S3에 업로드 - Post post = new Post(user, requestDto); + Post post = new Post(user, requestDto, 0L); postRepository.save(post); //게시물 db에 저장 - List collect = imageUrlList.stream().map(image->new Image(image,post)).collect(Collectors.toList()); //String List를 Image List로 변환 + List collect = imageUrlList.stream().map(image -> new Image(image, post)).collect(Collectors.toList()); //String List를 Image List로 변환 imageRepository.saveAll(collect); Long commentNum = commentRepository.countByPost(post); //댓글 수 게시물id로 세서 찾기 - 게시물을 저장 먼저 해야 id가 생겨서 count 가능 return ResponseDto.success(PostCreateResponseDto.builder() //responseDto 돌려주기 @@ -57,7 +56,7 @@ public ResponseDto getAllPosts() { for (Post post : posts) { //각 포스트마다 돌면서 Long commentNum = commentRepository.countByPost(post); //댓글 수 게시물id로 세서 찾기 postAllResponseDtoList.add(PostAllResponseDto.builder()//빈 array에 responseDto 만들어서 넣어주기 - .isHeart(heartService.isHeart(post.getId(),user)) + .isHeart(heartService.isHeart(post.getId(), user)) .post(post) .heartNum(post.getHeartNum()) .commentNum(commentNum) @@ -73,11 +72,11 @@ public ResponseDto getOnePost(Long postId) { .orElseThrow(() -> new EntityNotFoundException(ErrorCode.POST_NOT_FOUND)); //없을 시 찾을 수 없음 User user = tokenProvider.getUserFromAuthentication(); Long commentNum = commentRepository.countByPost(post); //댓글 수 게시물id로 세서 찾기 - return ResponseDto.success(PostDetailResponseDto.builder() //responseDto 돌려주기 + return ResponseDto.success(PostDetailResponseDto.builder() //responseDto 돌려주기 .post(post) .heartNum(post.getHeartNum()) .commentNum(commentNum) - .isHeart(heartService.isHeart(post.getId(),user)) + .isHeart(heartService.isHeart(post.getId(), user)) .build()); } @@ -85,8 +84,8 @@ public ResponseDto getOnePost(Long postId) { @Transactional public ResponseDto updateOnePost(Long postId, User user, PostRequestDto requestDto) { Post post = postRepository.findById(postId) //게시물 찾기 - .orElseThrow(() ->new EntityNotFoundException(ErrorCode.POST_NOT_FOUND)); //없을 시 찾을 수 없음 - if(!user.getId().equals(post.getUser().getId())){ //로그인한 사용자=게시물 작성자인지 확인 + .orElseThrow(() -> new EntityNotFoundException(ErrorCode.POST_NOT_FOUND)); //없을 시 찾을 수 없음 + if (!user.getId().equals(post.getUser().getId())) { //로그인한 사용자=게시물 작성자인지 확인 throw new InvalidValueException(ErrorCode.POST_UNAUTHORIZED); //아닐 시 권한 없음 } post.update(requestDto); //맞을 시 업데이트 @@ -97,9 +96,44 @@ public ResponseDto updateOnePost(Long postId, User user, PostRequestDto reque public void deleteOnePost(Long postId, User user) { Post post = postRepository.findById(postId) //게시물 찾기 .orElseThrow(() -> new EntityNotFoundException(ErrorCode.POST_NOT_FOUND)); //없을 시 찾을 수 없음 - if(!user.getId().equals(post.getUser().getId())){ //로그인한 사용자=게시물 작성자인지 확인 + if (!user.getId().equals(post.getUser().getId())) { //로그인한 사용자=게시물 작성자인지 확인 throw new InvalidValueException(ErrorCode.POST_UNAUTHORIZED); //아닐 시 권한 없음 } postRepository.deleteById(postId); //맞을 시 삭제 } + + // 유저가 쓴 글 조회 + @Transactional + public ResponseDto getMyPage(Long userId) { + User user = userRepository.findById(userId).orElseThrow( + () -> new EntityNotFoundException(ErrorCode.USER_NOT_FOUND)); + MyPageResponseDto myPageResponseDto = MyPageResponseDto.builder() + .user(user) + .postTotalNum(postRepository.countByUserId(userId)) + .heartTotalNum(heartService.totalHeartsByUser(userId)) + .contentList(getMyPostList(user)) + .build(); + return ResponseDto.success(myPageResponseDto); + } + + public List getMyPostList(User user) { + List posts = postRepository.findAllByUserOrderByCreatedAtDesc(user); + if (!(posts == null)) { + List contentsList = new ArrayList<>(); + for (Post post : posts) { + Long commentNum = commentRepository.countByPost(post); + PostCreateResponseDto mypostResponseDto = PostCreateResponseDto.builder() + .post(post) + .imageUrl(post.getImageList().get(0).getImageUrl()) + .heartNum(post.getHeartNum()) + .commentNum(commentNum) + .build(); + contentsList.add(mypostResponseDto); + } + return contentsList; + } else { + return null; + } + } + } From d7f5c2e3f1e7e7bdc0cef08bd88cf9ed751c772d Mon Sep 17 00:00:00 2001 From: HASEUNGHEEE Date: Wed, 24 Aug 2022 15:24:27 +0900 Subject: [PATCH 06/14] =?UTF-8?q?[#18]=20fix:=20=EC=8A=A4=EC=9B=A8?= =?UTF-8?q?=EA=B1=B0=20=EC=84=A4=EC=A0=95=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/clonecode/inssagram/dto/response/MyPageResponseDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java index ab33877..cff4b69 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/MyPageResponseDto.java @@ -19,7 +19,7 @@ public class MyPageResponseDto { @ApiModelProperty(example = "사용자가 받은 총 하트 수") private Long heartTotalNum; - @ApiModelProperty(example = "사용자가 작성한 게시글 목록록") + @ApiModelProperty(example = "사용자가 작성한 게시글 목록") private List contentList; @Builder From 29a0001836922ad2b1be41062b649b76daedc50c Mon Sep 17 00:00:00 2001 From: HASEUNGHEEE Date: Wed, 24 Aug 2022 15:50:33 +0900 Subject: [PATCH 07/14] =?UTF-8?q?[#28]=20Feat:=20Heart=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=8C=8C=EC=9D=BC=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/clonecode/inssagram/controller/HeartController.java | 6 +++++- .../clonecode/inssagram/dto/request/HeartRequestDto.java | 2 ++ .../clonecode/inssagram/dto/response/HeartResponseDto.java | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/clonecode/inssagram/controller/HeartController.java b/src/main/java/com/clonecode/inssagram/controller/HeartController.java index 926ded6..8c5a725 100644 --- a/src/main/java/com/clonecode/inssagram/controller/HeartController.java +++ b/src/main/java/com/clonecode/inssagram/controller/HeartController.java @@ -1,7 +1,10 @@ package com.clonecode.inssagram.controller; import com.clonecode.inssagram.dto.request.HeartRequestDto; +import com.clonecode.inssagram.dto.response.HeartResponseDto; import com.clonecode.inssagram.service.HeartService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -9,12 +12,13 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; - +@Api(tags = {"좋아요 API Controller"}) @RestController @RequiredArgsConstructor public class HeartController { private final HeartService heartService; + @ApiOperation(value = "좋아요", notes = "좋아요 기능", response = HeartResponseDto.class) @PostMapping("/api/likes/{postId}") public ResponseEntity toggleHeart(@PathVariable(name = "postId") Long postId, @RequestBody HeartRequestDto requestDto) { diff --git a/src/main/java/com/clonecode/inssagram/dto/request/HeartRequestDto.java b/src/main/java/com/clonecode/inssagram/dto/request/HeartRequestDto.java index e64a581..de9a6d5 100644 --- a/src/main/java/com/clonecode/inssagram/dto/request/HeartRequestDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/request/HeartRequestDto.java @@ -1,8 +1,10 @@ package com.clonecode.inssagram.dto.request; +import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @Getter public class HeartRequestDto { + @ApiModelProperty(example = "현재 좋아요 상태") private Long isHeart; } diff --git a/src/main/java/com/clonecode/inssagram/dto/response/HeartResponseDto.java b/src/main/java/com/clonecode/inssagram/dto/response/HeartResponseDto.java index 73d051d..1581f1e 100644 --- a/src/main/java/com/clonecode/inssagram/dto/response/HeartResponseDto.java +++ b/src/main/java/com/clonecode/inssagram/dto/response/HeartResponseDto.java @@ -1,5 +1,6 @@ package com.clonecode.inssagram.dto.response; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -10,6 +11,8 @@ @AllArgsConstructor @NoArgsConstructor public class HeartResponseDto { + @ApiModelProperty(example = "좋아요 수") private Long heartNum; + @ApiModelProperty(example = "현재 좋아요 상태") private Long isHeart; } From c871afe483b4220021edeb55d5179fba22d6c232 Mon Sep 17 00:00:00 2001 From: Moveuk Date: Wed, 24 Aug 2022 15:54:53 +0900 Subject: [PATCH 08/14] =?UTF-8?q?Build:=20=EB=B9=8C=EB=93=9C=20yml=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=95=94=ED=98=B8=ED=99=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 2 ++ application.yml.enc | Bin 0 -> 1111 bytes scripts/deploy.sh | 2 +- src/main/resources/application.yml | 23 ----------------------- 4 files changed, 3 insertions(+), 24 deletions(-) create mode 100644 application.yml.enc delete mode 100644 src/main/resources/application.yml diff --git a/.travis.yml b/.travis.yml index bc22bf0..f1c02be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,8 @@ branches: # 빌드 전에 gradlew의 권한을 추가한다. before_install: + - openssl aes-256-cbc -K $encrypted_c1e35b1b62fe_key -iv $encrypted_c1e35b1b62fe_iv + -in application.yml.enc -out ./src/main/resources/application.yml -d - chmod +x gradlew # Travis CI 서버의 Home diff --git a/application.yml.enc b/application.yml.enc new file mode 100644 index 0000000000000000000000000000000000000000..7f050c9beb666bf909428db4bb31aa4850e4f6ae GIT binary patch literal 1111 zcmV-d1gQJ!nr}7eH4YCfPmpT3Ot_F{L!<@rKoYd^!AC~{2{)LywZsm>tIRprmXVpQ z`{kQFZ=}dmG|feM4f(7ScycH`^adk{cJ}C>(ITqfP;&1WTMY`D5I(yBVIRQ5?7xdp zF@d(r9tj(mb3owW8@fior}y%Zr?t*Y@Nu((2d;^|4GK~JWcEw-7?{B~awCh%MMCop z3Q^me3liCv7^^;i4arDqGamQKN-KeVs^EZR1o91h?p1#+v3ACw_SZzutPwkopkR*u z_?^|5O~xC~O0iEfGel(Fr5U7XYGIRyQ<(8oArS;zjS#T`Oydm-?OHR;8jC(r1bpjuL8!6A6dRC_S|s%ongn>+Ln}#oYvLNGmF&~ zN$T{HTiQX)pKOffGZdRY!)Eh$YJFqq-&nr0pPHmqB0r* z7IhCpAhh86__0fb@TX{D0UZs<>bmtf_T$}D*jGHNYtwm393&Sm@ZYY$6+rhnjMZji-E?C(SESS9@mH({K*fNg2BfmO8Zr1<+{xBmZ2*r;jC>62 zom33qiEE)mHie_R9_r}47YW<2hiF!bVAye!UF}S(kw-|FCp-1UGtD!h`blEQu$GK3*?x8!kWfhWkvc zc#FCpw1j=DLc+?KfG%kU2Ji(jcyTcxZ4NTGZ$>r%6}234pMn?zcC958*G5-4rvJ(4 z!IQtC9IqPd7xnY?9IyLp1Ejk~IN$6kTtfH(&n!|dX5!U6M8=~KoHVvQB#q3@5c?p0 ztVuo`g?rQ*cY=uyK+X3Ep`fp!>aAT7N5C=zhE~ z#=s$FwdW@B;(S6JdkqSZ*@<0fq@`=WN+49CLo5cnrX`{99}(phK6&-e#@VsW;SL(4 d0(GAH*IDBE-M-IcLO8GvQDgJW8ppIYvaV&2BqRU; literal 0 HcmV?d00001 diff --git a/scripts/deploy.sh b/scripts/deploy.sh index a9974c3..b6869f2 100644 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -35,6 +35,6 @@ chmod +x $JAR_NAME # JAR 파일에 대한 권한이 없으므로 부여함. echo "> $JAR_NAME 실행" -nohup java -jar -Dspring.config.location=classpath:/application.yml,/home/ubuntu/app/application-server.yml $JAR_NAME > $REPOSITORY/nohup.out 2>&1 & # nobup 실행하면 CodeDeploy가 무한 대기하므로 nobup.out을 표준 입출력용으로 별도로 사용함. +nohup java -jar $JAR_NAME > $REPOSITORY/nohup.out 2>&1 & # nobup 실행하면 CodeDeploy가 무한 대기하므로 nobup.out을 표준 입출력용으로 별도로 사용함. # 이렇게 하지 않으면 nohup.out 파일이 생성되지 않고, CodeDeploy 로그에 표준 입출력이 출력됨. # nohup이 끝나기 전까지 CodeDeploy도 끝나지 않으니 꼭 이렇게 해야만 함. \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index ac50716..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,23 +0,0 @@ -spring: - jpa: - show_sql: true - hibernate: - ddl-auto: update - properties: - hibernate: - format_sql: true - -server: - error: - include-exception: false # Response에 Exception 표시 여부 - include-message: always # Response에 Exception Message 표시 여부 - include-stacktrace: on_param # Response에 Stack Trace 표시 여부 - servlet: - encoding: - charset: utf-8 - enabled: true - force: true - -# echo 'spring-boot-security-jwt-hanghae-assignment-spring-boot-security-jwt-secret-key' | base64 -jwt: - secret: 4oCYc3ByaW5nLWJvb3Qtc2VjdXJpdHktand0LWhhbmdoYWUtYXNzaWdubWVudC1zcHJpbmctYm9vdC1zZWN1cml0eS1qd3Qtc2VjcmV0LWtleeKAmQo= From 2c3842b01e4ee62db8e35af5f99d6974922537ca Mon Sep 17 00:00:00 2001 From: Moveuk Date: Wed, 24 Aug 2022 16:14:18 +0900 Subject: [PATCH 09/14] =?UTF-8?q?Build:=20=EB=B9=8C=EB=93=9C=20yml=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=95=94=ED=98=B8=ED=99=94=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 81 ++++++++++++++++++++++---------------------- application.tar.enc | Bin 0 -> 10298 bytes application.yml.enc | Bin 1111 -> 0 bytes 3 files changed, 41 insertions(+), 40 deletions(-) create mode 100644 application.tar.enc delete mode 100644 application.yml.enc diff --git a/.travis.yml b/.travis.yml index f1c02be..e73225c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,26 +1,29 @@ # 언어와 jdk의 버전을 지정한다. language: java jdk: - - openjdk11 +- openjdk11 # 어느 브랜치가 push 될 때 수행할지 지정한다. # 오직 main 브랜치가 push될 때 수행하도록 지정하였다. branches: only: - - main + - main -# 빌드 전에 gradlew의 권한을 추가한다. +# 빌드 전에 할 일 +# application 복호화하여 사용할 수있도록 하기 +# gradlew의 권한을 추가한다. before_install: - - openssl aes-256-cbc -K $encrypted_c1e35b1b62fe_key -iv $encrypted_c1e35b1b62fe_iv - -in application.yml.enc -out ./src/main/resources/application.yml -d - - chmod +x gradlew +- openssl aes-256-cbc -K $encrypted_f27943cb6563_key -iv $encrypted_f27943cb6563_iv + -in application.tar.enc -out ./src/main/resources/application.tar -d +- tar xvf ./src/main/resources/application.tar +- chmod +x gradlew # Travis CI 서버의 Home # gradle을 통하여 의존성을 받게 되면 이를 캐시하여 배포할 때 마다 다시 받지 않도록 설정한다. cache: directories: - - '$HOME/.m2/repository' - - '$HOME/.gradle' + - "$HOME/.m2/repository" + - "$HOME/.gradle" # main 브랜치에 push 되면 수행되는 명령어이다. # 프로젝트 내에 권한이 추가된 gradlew를 활용하여 clean, build를 진행한다. @@ -30,42 +33,40 @@ script: "./gradlew clean build" notifications: email: recipients: - - v_donguk@naver.com + - v_donguk@naver.com # deploy 명령어가 실행되기 전 전처리 과정 # CodeDeploy는 Jar 파일을 인식 못하므로 Jar+기타 설정 파일들을 모아 압축함. before_deploy: - - mkdir -p before-deploy # zip에 파합시킬 파일들을 담을 디렉토리 생성 - - cp scripts/*.sh before-deploy/ # 스크립트 파일 복사 - - cp appspec.yml before-deploy/ # CodeDeploy 설정 파일 복사 - - cp build/libs/*.jar before-deploy/ # jar 배포파일 복사 - - cd before-deploy && zip -r before-deploy * # before-deploy로 이동하여 전체 파일 압축함 - - cd ../ && mkdir -p deploy # 상위 디렉토리 이동하여 deploy 디렉토리 생성 - - mv before-deploy/before-deploy.zip deploy/backend_server.zip # deploy로 zip파일 이동 +- mkdir -p before-deploy # zip에 파합시킬 파일들을 담을 디렉토리 생성 +- cp scripts/*.sh before-deploy/ # 스크립트 파일 복사 +- cp appspec.yml before-deploy/ # CodeDeploy 설정 파일 복사 +- cp build/libs/*.jar before-deploy/ # jar 배포파일 복사 +- cd before-deploy && zip -r before-deploy * # before-deploy로 이동하여 전체 파일 압축함 +- cd ../ && mkdir -p deploy # 상위 디렉토리 이동하여 deploy 디렉토리 생성 +- mv before-deploy/before-deploy.zip deploy/backend_server.zip # deploy로 zip파일 이동 # S3 파일 업로드 혹은 CodeDeploy로 배포 등 외부 서비스와 연동될 행위들을 선언. deploy: - - provider: s3 - access_key_id: $AWS_ACCESS_KEY # Travis repo settings에서 설정된 값 - secret_access_key: $AWS_SECRET_KEY # Travis repo settings에서 설정된 값 - bucket: ldu-springboot-build # S3 버킷 이름 - region: ap-northeast-2 # 지역이름 - skip_cleanup: true - acl: private # zip 파일 접근을 private으로 설정 - local_dir: deploy # before_deploy에서 생성한 디렉토리에 있는 파일들만 S3로 정송 - on: - all_branches: true - - - provider: codedeploy - access_key_id: $AWS_ACCESS_KEY # Travis repo settings에서 설정된 값 - secret_access_key: $AWS_SECRET_KEY # Travis repo settings에서 설정된 값 - bucket: ldu-springboot-build # S3 버킷 이름 - key: backend_server.zip # 빌드 파일을 압축해서 전달 - bundle_type: zip # 압축 확장자 - application: backend_server # 웹 콘솔에서 등록한 CodeDeploy 애플리케이션 - deployment_group: backend_server-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹 이름 - region: ap-northeast-2 # 지역이름 - wait-until-deployed: true - on: - all_branches: true - +- provider: s3 + access_key_id: "$AWS_ACCESS_KEY" # Travis repo settings에서 설정된 값 + secret_access_key: "$AWS_SECRET_KEY" # Travis repo settings에서 설정된 값 + bucket: ldu-springboot-build # S3 버킷 이름 + region: ap-northeast-2 # 지역이름 + skip_cleanup: true + acl: private # zip 파일 접근을 private으로 설정 + local_dir: deploy # before_deploy에서 생성한 디렉토리에 있는 파일들만 S3로 정송 + on: + all_branches: true +- provider: codedeploy + access_key_id: "$AWS_ACCESS_KEY" # Travis repo settings에서 설정된 값 + secret_access_key: "$AWS_SECRET_KEY" # Travis repo settings에서 설정된 값 + bucket: ldu-springboot-build # S3 버킷 이름 + key: backend_server.zip # 빌드 파일을 압축해서 전달 + bundle_type: zip # 압축 확장자 + application: backend_server # 웹 콘솔에서 등록한 CodeDeploy 애플리케이션 + deployment_group: backend_server-group # 웹 콘솔에서 등록한 CodeDeploy 배포 그룹 이름 + region: ap-northeast-2 # 지역이름 + wait-until-deployed: true + on: + all_branches: true diff --git a/application.tar.enc b/application.tar.enc new file mode 100644 index 0000000000000000000000000000000000000000..c2b2a6d9199c285ea980b415ae7dfb9cf55a2a62 GIT binary patch literal 10298 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 M|DhEE*IL-T%f|=c&;S4c literal 0 HcmV?d00001 diff --git a/application.yml.enc b/application.yml.enc deleted file mode 100644 index 7f050c9beb666bf909428db4bb31aa4850e4f6ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1111 zcmV-d1gQJ!nr}7eH4YCfPmpT3Ot_F{L!<@rKoYd^!AC~{2{)LywZsm>tIRprmXVpQ z`{kQFZ=}dmG|feM4f(7ScycH`^adk{cJ}C>(ITqfP;&1WTMY`D5I(yBVIRQ5?7xdp zF@d(r9tj(mb3owW8@fior}y%Zr?t*Y@Nu((2d;^|4GK~JWcEw-7?{B~awCh%MMCop z3Q^me3liCv7^^;i4arDqGamQKN-KeVs^EZR1o91h?p1#+v3ACw_SZzutPwkopkR*u z_?^|5O~xC~O0iEfGel(Fr5U7XYGIRyQ<(8oArS;zjS#T`Oydm-?OHR;8jC(r1bpjuL8!6A6dRC_S|s%ongn>+Ln}#oYvLNGmF&~ zN$T{HTiQX)pKOffGZdRY!)Eh$YJFqq-&nr0pPHmqB0r* z7IhCpAhh86__0fb@TX{D0UZs<>bmtf_T$}D*jGHNYtwm393&Sm@ZYY$6+rhnjMZji-E?C(SESS9@mH({K*fNg2BfmO8Zr1<+{xBmZ2*r;jC>62 zom33qiEE)mHie_R9_r}47YW<2hiF!bVAye!UF}S(kw-|FCp-1UGtD!h`blEQu$GK3*?x8!kWfhWkvc zc#FCpw1j=DLc+?KfG%kU2Ji(jcyTcxZ4NTGZ$>r%6}234pMn?zcC958*G5-4rvJ(4 z!IQtC9IqPd7xnY?9IyLp1Ejk~IN$6kTtfH(&n!|dX5!U6M8=~KoHVvQB#q3@5c?p0 ztVuo`g?rQ*cY=uyK+X3Ep`fp!>aAT7N5C=zhE~ z#=s$FwdW@B;(S6JdkqSZ*@<0fq@`=WN+49CLo5cnrX`{99}(phK6&-e#@VsW;SL(4 d0(GAH*IDBE-M-IcLO8GvQDgJW8ppIYvaV&2BqRU; From fae36d5f903ec98fda11471d2db9dfef1cf08b86 Mon Sep 17 00:00:00 2001 From: jeanniejang Date: Wed, 24 Aug 2022 22:28:38 +0900 Subject: [PATCH 10/14] =?UTF-8?q?=F0=9F=94=A5!HOTFIX:=20=EA=B8=B4=EA=B8=89?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=EC=9C=A0=EC=A0=80=20controller=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=B2=84=EA=B7=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/clonecode/inssagram/controller/UserController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/clonecode/inssagram/controller/UserController.java b/src/main/java/com/clonecode/inssagram/controller/UserController.java index 4584b90..3d99429 100644 --- a/src/main/java/com/clonecode/inssagram/controller/UserController.java +++ b/src/main/java/com/clonecode/inssagram/controller/UserController.java @@ -47,8 +47,8 @@ public ResponseEntity logout(HttpServletRequest request) { @RequestMapping(value = "/users/{userId}", method = RequestMethod.PUT) @ApiOperation(value = "유저 프로필 수정", notes = "유저 프로필 수정 기능") - public ResponseEntity editUserProfile(EditUserProfileRequestDto editUserProfileRequestDto, - List profileImageFile, @PathVariable Long userId) { + public ResponseEntity editUserProfile(@RequestPart EditUserProfileRequestDto editUserProfileRequestDto, + @RequestPart List profileImageFile, @PathVariable Long userId) { userService.editUserProfile(editUserProfileRequestDto, profileImageFile, userId); return new ResponseEntity<>("회원 정보 수정이 성공적으로 반영되었습니다", HttpStatus.valueOf(HttpStatus.OK.value())); } From 92f4a3d4593ac250f573fb65f284a2292c7ef4ee Mon Sep 17 00:00:00 2001 From: Moveuk Date: Wed, 24 Aug 2022 23:25:15 +0900 Subject: [PATCH 11/14] Build: v2.0.0-SNAPSHOT Release --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bd7b865..61afcb5 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'com.clonecode' -version = '1.0.1-SNAPSHOT' +version = '2.0.0-SNAPSHOT' sourceCompatibility = '11' configurations { From dbdabfc5f852dc2f0459bca555c05d9bc050ebd2 Mon Sep 17 00:00:00 2001 From: Moveuk Date: Thu, 25 Aug 2022 03:31:12 +0900 Subject: [PATCH 12/14] =?UTF-8?q?[#26]Fix:=20=EB=B3=B8=EC=9D=B8=EB=A7=8C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inssagram/global/error/ErrorCode.java | 1 + .../inssagram/service/UserService.java | 21 ++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/clonecode/inssagram/global/error/ErrorCode.java b/src/main/java/com/clonecode/inssagram/global/error/ErrorCode.java index 3a4ef88..68b24b1 100644 --- a/src/main/java/com/clonecode/inssagram/global/error/ErrorCode.java +++ b/src/main/java/com/clonecode/inssagram/global/error/ErrorCode.java @@ -22,6 +22,7 @@ public enum ErrorCode { USER_NOT_FOUND(404, "USER_NOT_FOUND", "해당 유저가 존재하지 않습니다."), PASSWORD_NOT_MATCHED(400, "PASSWORDS_NOT_MATCHED", "비밀번호와 비밀번호 확인이 일치하지 않습니다."), LOGIN_REQUIRED(400, "LOGIN_REQUIRED", "로그인이 필요합니다."), + USER_UNAUTHORIZED(401, "USER_UNAUTHORIZED", "유저 정보는 본인만 수정 가능합니다."), //Post POST_NOT_FOUND(400, "POST_NOT_FOUND", "존재하지 않는 게시글입니다."), diff --git a/src/main/java/com/clonecode/inssagram/service/UserService.java b/src/main/java/com/clonecode/inssagram/service/UserService.java index b5ee97b..670ebeb 100644 --- a/src/main/java/com/clonecode/inssagram/service/UserService.java +++ b/src/main/java/com/clonecode/inssagram/service/UserService.java @@ -19,6 +19,7 @@ import javax.servlet.http.HttpServletRequest; import java.util.List; +import java.util.Objects; import java.util.Optional; @RequiredArgsConstructor @@ -87,16 +88,18 @@ public ResponseDto login(LoginRequestDto requestDto) { } //로그아웃 - public ResponseDto logout(HttpServletRequest request) { + public void logout(HttpServletRequest request) { if (!tokenProvider.validateToken(request.getHeader("Refresh-Token"))) { - return ResponseDto.fail(ErrorCode.INVALID_TOKEN); + ResponseDto.fail(ErrorCode.INVALID_TOKEN); + return; } User user = tokenProvider.getUserFromAuthentication(); if (null == user) { - return ResponseDto.fail(ErrorCode.NOT_LOGIN_STATE); + ResponseDto.fail(ErrorCode.NOT_LOGIN_STATE); + return; } - return tokenProvider.deleteRefreshToken(user); + tokenProvider.deleteRefreshToken(user); } @Transactional(readOnly = true) @@ -136,7 +139,15 @@ public void editUserProfile(EditUserProfileRequestDto editUserProfileRequestDto, String userProfileImageUrl = storageService.uploadFile(profileImageFile, "userProfile/").get(0); //영속성 컨텍스트 User 넣음 User user = userRepository.findById(userId).orElseThrow(() -> new InvalidValueException(ErrorCode.USER_NOT_FOUND)); - + + User userFromAuthentication = tokenProvider.getUserFromAuthentication(); + + //로그인한 사람과 변경하는 유저 프로필의 값이 똑같아야 변경가능함. + if (!Objects.equals(user.getId(), userFromAuthentication.getId())) { + //다르면 exception + throw new InvalidValueException(ErrorCode.USER_UNAUTHORIZED); + } + //영속성 컨텍스트 update 변경 user.update(editUserProfileRequestDto, userProfileImageUrl); // Transaction 끝날 때 컨텍스트 스탭샷과 비교하여 변경 감지 후 flush되며 update 쿼리 나감. From 76ee7cec90b2740b968f1686679c3c55505ce93b Mon Sep 17 00:00:00 2001 From: Moveuk Date: Thu, 25 Aug 2022 09:53:10 +0900 Subject: [PATCH 13/14] Build: v2.0.1 version Release --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 61afcb5..9e07fe8 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group = 'com.clonecode' -version = '2.0.0-SNAPSHOT' +version = '2.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { From d8f9d6bb10dc078220290d7a521ee77761f40d03 Mon Sep 17 00:00:00 2001 From: Moveuk Date: Thu, 25 Aug 2022 17:15:36 +0900 Subject: [PATCH 14/14] =?UTF-8?q?[#32]Build:=20=EC=9E=90=EB=8F=99=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC=20=ED=99=98=EA=B2=BD=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 3 -- src/main/resources/application.yml | 50 ++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/application.yml diff --git a/.travis.yml b/.travis.yml index e73225c..e23806f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,6 @@ branches: # application 복호화하여 사용할 수있도록 하기 # gradlew의 권한을 추가한다. before_install: -- openssl aes-256-cbc -K $encrypted_f27943cb6563_key -iv $encrypted_f27943cb6563_iv - -in application.tar.enc -out ./src/main/resources/application.tar -d -- tar xvf ./src/main/resources/application.tar - chmod +x gradlew # Travis CI 서버의 Home diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..f07500a --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,50 @@ +spring: + # h2: + # console: + # enabled: true + + # datasource: + # url: jdbc:h2:mem:inssagram + # driver-class-name: org.h2.Driver + # username: sa + # password: + + datasource: + url: jdbc:mysql://ldudb.cs3wzmj0phr7.ap-northeast-2.rds.amazonaws.com:3306/inssagram + username: ${MYSQLID} + password: ${MYSQLPWD} + + jpa: + show_sql: true + hibernate: + ddl-auto: none + properties: + hibernate: + format_sql: true + +server: + error: + include-exception: false # Response에 Exception 표시 여부 + include-message: always # Response에 Exception Message 표시 여부 + include-stacktrace: on_param # Response에 Stack Trace 표시 여부 + servlet: + encoding: + charset: utf-8 + enabled: true + force: true + +# echo 'spring-boot-security-jwt-hanghae-assignment-spring-boot-security-jwt-secret-key' | base64 +jwt: + secret: 4oCYc3ByaW5nLWJvb3Qtc2VjdXJpdHktand0LWhhbmdoYWUtYXNzaWdubWVudC1zcHJpbmctYm9vdC1zZWN1cml0eS1qd3Qtc2VjcmV0LWtleeKAmQo= + +cloud: + aws: + credentials: + access-key: ${ACCESSKEY} + secret-key: ${SECRETKEY} + s3: + bucket: inssagram + region: + static: ap-northeast-2 + stack: + auto: false \ No newline at end of file