Skip to content

Commit

Permalink
Merge branch 'dev' into feat/#131
Browse files Browse the repository at this point in the history
  • Loading branch information
woo-chang committed Jul 29, 2023
2 parents b4032bb + d762c15 commit c87919a
Show file tree
Hide file tree
Showing 30 changed files with 847 additions and 182 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RequestBody;
Expand Down Expand Up @@ -50,4 +51,15 @@ public ResponseEntity<Void> changeNickname(
return ResponseEntity.ok().build();
}

@Operation(summary = "회원 탈퇴", description = "서비스를 탈퇴한다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "회원 탈퇴 성공"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 회원")
})
@DeleteMapping("/me/delete")
public ResponseEntity<Void> deleteMember(@Auth final Member member) {
memberService.deleteMember(member);
return ResponseEntity.noContent().build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,14 @@
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = {"id"})
@ToString
@Getter
@Entity
public class Member extends BaseEntity {
Expand Down Expand Up @@ -45,7 +49,7 @@ public class Member extends BaseEntity {
private String socialId;

@Column(nullable = false)
private Integer point;
private int point;

@Builder
private Member(
Expand All @@ -69,7 +73,7 @@ private Member(
public static Member from(final KakaoMemberResponse response) {
final NicknameNumberGenerator nicknameNumberGenerator = new NicknameNumberGenerator();
return Member.builder()
.nickname("익명의 손님" + nicknameNumberGenerator.generate())
.nickname("익명의손님" + nicknameNumberGenerator.generate())
.gender(Gender.valueOf(response.kakaoAccount().gender().toUpperCase()))
.ageRange(response.kakaoAccount().ageRange())
.birthday(response.kakaoAccount().birthday())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public Member findById(final Long memberId) {

@Transactional(readOnly = true)
public MemberInfoResponse findMemberInfo(final Member member) {
final int numberOfPosts = postRepository.countByMember(member);
final int numberOfPosts = postRepository.countByWriter(member);
final int numberOfVotes = voteRepository.countByMember(member);

return new MemberInfoResponse(
Expand All @@ -63,4 +63,11 @@ private void validateExistentNickname(final String nickname) {
}
}

@Transactional
public void deleteMember(final Member member) {
final Member existentMember = memberRepository.findById(member.getId())
.orElseThrow(() -> new NotFoundException(MemberExceptionType.NONEXISTENT_MEMBER));
memberRepository.delete(existentMember);
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.votogether.domain.post.controller;

import com.votogether.domain.member.entity.Gender;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.entity.SocialType;
import com.votogether.domain.post.dto.request.PostCreateRequest;
import com.votogether.domain.post.dto.response.PostResponse;
import com.votogether.domain.post.dto.response.VoteOptionStatisticsResponse;
import com.votogether.domain.post.entity.PostClosingType;
import com.votogether.domain.post.entity.PostSortType;
import com.votogether.domain.post.service.PostService;
import com.votogether.global.jwt.Auth;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -35,57 +36,60 @@ public class PostController {
@Operation(summary = "게시글 작성", description = "게시글을 저장한다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "게시물 생성되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 입력입니다."),
@ApiResponse(responseCode = "500", description = "인터넷 서버 오류입니다.")
@ApiResponse(responseCode = "400", description = "잘못된 입력입니다.")
})
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Void> save(
@RequestPart final PostCreateRequest request,
@RequestPart final List<MultipartFile> images
@RequestPart final List<MultipartFile> images,
@Auth final Member loginMember
) {
// TODO : 일단 돌아가게 하기 위한 member 저장 (실제 어플에선 삭제될 코드)
final Member member = Member.builder()
.socialType(SocialType.KAKAO)
.socialId("tjdtls690")
.nickname("Abel")
.gender(Gender.MALE)
.birthday("0718")
.ageRange("10~14")
.socialType(SocialType.KAKAO)
.socialId("tjdtls690")
.point(100)
.ageRange("30~39")
.birthday("0101")
.build();

final Long postId = postService.save(request, member, images);
final long postId = postService.save(request, loginMember, images);
return ResponseEntity.created(URI.create("/posts/" + postId)).build();
}

@Operation(summary = "게시글 조회", description = "게시글을 조회한다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "게시글을 조회했습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 입력입니다.")
})
@GetMapping
public ResponseEntity<List<PostResponse>> getAllPost(
final int page,
final PostClosingType postClosingType,
final PostSortType postSortType,
@Auth final Member loginMember
) {
final List<PostResponse> responses =
postService.getAllPostBySortTypeAndClosingType(loginMember, page, postClosingType, postSortType);

return ResponseEntity.ok(responses);
}

@Operation(summary = "게시글 투표 통계 조회", description = "게시글 투표에 대한 전체 통계를 조회한다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "게시글 투표 통계 조회 성공"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 게시글")
})
@GetMapping("/{postId}/options")
public ResponseEntity<VoteOptionStatisticsResponse> getVoteStatistics(
@PathVariable final Long postId,
@PathVariable final long postId,
@Auth final Member member
) {
final VoteOptionStatisticsResponse response = postService.getVoteStatistics(postId, member);
return ResponseEntity.ok(response);
}

@Operation(summary = "게시글 투표 선택지 통계 조회", description = "게시글 특정 투표 선택지에 대한 통계를 조회한다.")
@ApiResponses({
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "게시글 투표 선택지 통계 조회 성공"),
@ApiResponse(responseCode = "400", description = "게시글 투표 옵션이 게시글에 속하지 않아 조회 실패"),
@ApiResponse(responseCode = "404", description = "존재하지 않는 게시글이거나 게시글 투표 옵션")
})
@GetMapping("/{postId}/options/{optionId}")
public ResponseEntity<VoteOptionStatisticsResponse> getVoteOptionStatistics(
@PathVariable final Long postId,
@PathVariable final Long optionId,
@PathVariable final long postId,
@PathVariable final long optionId,
@Auth final Member member
) {
final VoteOptionStatisticsResponse response = postService.getVoteOptionStatistics(postId, optionId, member);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.votogether.domain.post.dto.response;

import com.votogether.domain.category.entity.Category;

public record CategoryResponse(
long id,
String name
) {

public static CategoryResponse of(Category category) {
return new CategoryResponse(category.getId(), category.getName());
}

@Override
public String toString() {
return "CategoryResponse{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.votogether.domain.post.dto.response;

import com.votogether.domain.post.entity.PostOption;

public record PostOptionResponse(
long optionId,
String content,
int voteCount,
double votePercent
) {

public static PostOptionResponse of(
final PostOption postOption,
final boolean isVisibleVoteResult,
final Long totalVoteCount
) {
return new PostOptionResponse(
postOption.getId(),
postOption.getContent(),
postOption.getVoteCount(isVisibleVoteResult),
postOption.getVotePercent(totalVoteCount)
);
}

@Override
public String toString() {
return "OptionResponse{" +
"optionId=" + optionId +
", content='" + content + '\'' +
", voteCount=" + voteCount +
", votePercent=" + votePercent +
'}';
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.votogether.domain.post.dto.response;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.post.entity.Post;
import com.votogether.domain.post.entity.PostBody;
import com.votogether.domain.post.entity.PostCategory;
import java.time.LocalDateTime;
import java.util.List;

public record PostResponse(
Long postId,
WriterResponse writer,
String title,
String content,
List<CategoryResponse> categories,
LocalDateTime createdAt,
LocalDateTime deadline,
VoteResponse voteInfo
) {

public static PostResponse of(final Post post, final Member loginMember) {
final Member writer = post.getWriter();
final PostBody postBody = post.getPostBody();

return new PostResponse(
post.getId(),
WriterResponse.of(writer.getId(), writer.getNickname().getValue()),
postBody.getTitle(),
postBody.getContent(),
getCategories(post),
post.getCreatedAt(),
post.getDeadline(),
VoteResponse.of(
post.getPostOptions().getSelectedOptionId(loginMember),
post.getFinalTotalVoteCount(loginMember),
getOptions(post, loginMember)
)
);
}

private static List<CategoryResponse> getCategories(final Post post) {
return post.getPostCategories().getPostCategories().stream()
.map(PostCategory::getCategory)
.map(CategoryResponse::of)
.toList();
}

private static List<PostOptionResponse> getOptions(
final Post post,
final Member loginMember
) {
return post.getPostOptions().getPostOptions().stream()
.map(postOption ->
PostOptionResponse.of(
postOption,
post.isVisibleVoteResult(loginMember),
post.getFinalTotalVoteCount(loginMember)
)
)
.toList();
}

@Override
public String toString() {
return "PostResponse{" +
"postId=" + postId +
", writer=" + writer +
", title='" + title + '\'' +
", content='" + content + '\'' +
", categories=" + categories +
", createdAt=" + createdAt +
", deadline=" + deadline +
", voteInfo=" + voteInfo +
'}' + "\n\n";
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.votogether.domain.post.dto.response;

import java.util.List;

public record VoteResponse(
long selectedOptionId,
long totalVoteCount,
List<PostOptionResponse> options
) {

public static VoteResponse of(
final long selectedOptionId,
final long finalTotalVoteCount,
final List<PostOptionResponse> options
) {
return new VoteResponse(selectedOptionId, finalTotalVoteCount, options);
}

@Override
public String toString() {
return "VoteInfoResponse{" +
"selectedOptionId=" + selectedOptionId +
", totalVoteCount=" + totalVoteCount +
", options=" + options +
'}';
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.votogether.domain.post.dto.response;

public record WriterResponse(
Long id,
String nickname
) {

public static WriterResponse of(final Long id, final String nickname) {
return new WriterResponse(id, nickname);
}

@Override
public String toString() {
return "WriterResponse{" +
"id=" + id +
", nickname='" + nickname + '\'' +
'}';
}

}
Loading

0 comments on commit c87919a

Please sign in to comment.