diff --git a/src/main/java/EBus/EBusback/domain/heart/controller/HeartController.java b/src/main/java/EBus/EBusback/domain/heart/controller/HeartController.java new file mode 100644 index 0000000..23d2cca --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/heart/controller/HeartController.java @@ -0,0 +1,23 @@ +package EBus.EBusback.domain.heart.controller; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import EBus.EBusback.domain.heart.dto.HeartRequestDto; +import EBus.EBusback.domain.heart.service.HeartService; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/hearts") +public class HeartController { + + private final HeartService heartService; + + @PostMapping + public String clickHeart(@RequestBody HeartRequestDto requestDto) { + return heartService.createOrRemoveHeart(requestDto.getPostId()); + } +} diff --git a/src/main/java/EBus/EBusback/domain/heart/dto/HeartRequestDto.java b/src/main/java/EBus/EBusback/domain/heart/dto/HeartRequestDto.java new file mode 100644 index 0000000..812cf00 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/heart/dto/HeartRequestDto.java @@ -0,0 +1,9 @@ +package EBus.EBusback.domain.heart.dto; + +import lombok.Getter; + +@Getter +public class HeartRequestDto { + + private Long postId; +} diff --git a/src/main/java/EBus/EBusback/domain/heart/entity/Heart.java b/src/main/java/EBus/EBusback/domain/heart/entity/Heart.java index 2611b96..61f7706 100644 --- a/src/main/java/EBus/EBusback/domain/heart/entity/Heart.java +++ b/src/main/java/EBus/EBusback/domain/heart/entity/Heart.java @@ -1,9 +1,15 @@ package EBus.EBusback.domain.heart.entity; import EBus.EBusback.domain.member.entity.Member; - import EBus.EBusback.domain.post.entity.Post; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -13,25 +19,30 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Heart { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(nullable = false, updatable = false) - private Long heartId; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(nullable = false, updatable = false) + private Long heartId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "member_id", nullable = false) - private Member member; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "post_id", nullable = false) + private Post post; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "post_id", nullable = false) - private Post post; + @Column(nullable = false) + private Boolean isValid; - @Column(nullable = false) - private Boolean isValid; + @Builder + public Heart(Member member, Post post) { + this.member = member; + this.post = post; + this.isValid = false; + } - @Builder - public Heart(Member member, Post post){ - this.member = member; - this.post = post; - } + public void updateHeart() { + this.isValid = !isValid; + } } diff --git a/src/main/java/EBus/EBusback/domain/heart/repository/HeartRepository.java b/src/main/java/EBus/EBusback/domain/heart/repository/HeartRepository.java new file mode 100644 index 0000000..c50ea39 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/heart/repository/HeartRepository.java @@ -0,0 +1,16 @@ +package EBus.EBusback.domain.heart.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; + +import EBus.EBusback.domain.heart.entity.Heart; +import EBus.EBusback.domain.member.entity.Member; +import EBus.EBusback.domain.post.entity.Post; + +public interface HeartRepository extends JpaRepository { + + Optional findByMemberAndPost(Member member, Post post); + + Boolean existsByMemberAndPostAndIsValid(Member member, Post post, Boolean isValid); +} diff --git a/src/main/java/EBus/EBusback/domain/heart/service/HeartService.java b/src/main/java/EBus/EBusback/domain/heart/service/HeartService.java new file mode 100644 index 0000000..b138d90 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/heart/service/HeartService.java @@ -0,0 +1,44 @@ +package EBus.EBusback.domain.heart.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import EBus.EBusback.domain.heart.entity.Heart; +import EBus.EBusback.domain.heart.repository.HeartRepository; +import EBus.EBusback.domain.member.entity.Member; +import EBus.EBusback.domain.post.entity.Post; +import EBus.EBusback.domain.post.repository.PostRepository; +import EBus.EBusback.global.SecurityUtil; +import lombok.RequiredArgsConstructor; + +@Service +@Transactional +@RequiredArgsConstructor +public class HeartService { + + private final HeartRepository heartRepository; + private final PostRepository postRepository; + + public String createOrRemoveHeart(Long postId) { + Member member = SecurityUtil.getCurrentUser(); + if (member == null) + throw new RuntimeException("사용자를 찾을 수 없습니다."); + + Post post = postRepository.findById(postId) + .orElseThrow(() -> new IllegalArgumentException("글을 찾을 수 없습니다.")); + + Heart heart = heartRepository.findByMemberAndPost(member, post) + .orElseGet(() -> heartRepository.save(Heart.builder().member(member).post(post).build())); + + heart.updateHeart(); + + if (heart.getIsValid()) + return "좋아요가 등록되었습니다."; + else + return "좋아요가 취소되었습니다."; + } + + public Boolean existsHeart(Member member, Post post) { + return heartRepository.existsByMemberAndPostAndIsValid(member, post, true); + } +} diff --git a/src/main/java/EBus/EBusback/domain/notice/controller/NoticeController.java b/src/main/java/EBus/EBusback/domain/notice/controller/NoticeController.java new file mode 100644 index 0000000..35e7a23 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/notice/controller/NoticeController.java @@ -0,0 +1,51 @@ +package EBus.EBusback.domain.notice.controller; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import EBus.EBusback.domain.notice.dto.NoticeResponseDto; +import EBus.EBusback.domain.notice.service.NoticeService; +import EBus.EBusback.domain.post.dto.PostRequestDto; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/notices") +public class NoticeController { + + private final NoticeService noticeService; + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public NoticeResponseDto createNotice(@RequestBody PostRequestDto requestDto) { + return noticeService.createNotice(requestDto); + } + + @GetMapping("/{noticeId}") + @ResponseStatus(HttpStatus.OK) + public NoticeResponseDto findNotice(@PathVariable Long noticeId) { + return noticeService.findNotice(noticeId); + } + + @GetMapping + @ResponseStatus(HttpStatus.OK) + public List findNoticeList() { + return noticeService.findNoticeList(); + } + + @DeleteMapping("/{noticeId}") + @ResponseStatus(HttpStatus.OK) + public String removeNotice(@PathVariable Long noticeId) { + noticeService.removeNotice(noticeId); + return "공지사항이 삭제되었습니다."; + } +} diff --git a/src/main/java/EBus/EBusback/domain/notice/dto/NoticeResponseDto.java b/src/main/java/EBus/EBusback/domain/notice/dto/NoticeResponseDto.java new file mode 100644 index 0000000..fb0a251 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/notice/dto/NoticeResponseDto.java @@ -0,0 +1,22 @@ +package EBus.EBusback.domain.notice.dto; + +import java.time.LocalDateTime; + +import EBus.EBusback.domain.notice.entity.Notice; +import lombok.Getter; + +@Getter +public class NoticeResponseDto { + + private Long noticeId; + private String title; + private String content; + private LocalDateTime createdDate; + + public NoticeResponseDto(Notice notice) { + this.noticeId = notice.getNoticeId(); + this.title = notice.getTitle(); + this.content = notice.getContent(); + this.createdDate = notice.getCreatedDate(); + } +} diff --git a/src/main/java/EBus/EBusback/domain/notice/entity/Notice.java b/src/main/java/EBus/EBusback/domain/notice/entity/Notice.java index 32539eb..2585cb7 100644 --- a/src/main/java/EBus/EBusback/domain/notice/entity/Notice.java +++ b/src/main/java/EBus/EBusback/domain/notice/entity/Notice.java @@ -9,6 +9,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -28,6 +29,13 @@ public class Notice extends BaseTimeEntity { private String content; @ManyToOne - @JoinColumn(name = "member_id") - private Member member; + @JoinColumn(name = "writer_id") + private Member writer; + + @Builder + public Notice(String title, String content, Member writer) { + this.title = title; + this.content = content; + this.writer = writer; + } } diff --git a/src/main/java/EBus/EBusback/domain/notice/repository/NoticeRepository.java b/src/main/java/EBus/EBusback/domain/notice/repository/NoticeRepository.java new file mode 100644 index 0000000..3753a4e --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/notice/repository/NoticeRepository.java @@ -0,0 +1,8 @@ +package EBus.EBusback.domain.notice.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import EBus.EBusback.domain.notice.entity.Notice; + +public interface NoticeRepository extends JpaRepository { +} diff --git a/src/main/java/EBus/EBusback/domain/notice/service/NoticeService.java b/src/main/java/EBus/EBusback/domain/notice/service/NoticeService.java new file mode 100644 index 0000000..dc469c7 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/notice/service/NoticeService.java @@ -0,0 +1,53 @@ +package EBus.EBusback.domain.notice.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import EBus.EBusback.domain.member.entity.Member; +import EBus.EBusback.domain.member.entity.Role; +import EBus.EBusback.domain.notice.dto.NoticeResponseDto; +import EBus.EBusback.domain.notice.entity.Notice; +import EBus.EBusback.domain.notice.repository.NoticeRepository; +import EBus.EBusback.domain.post.dto.PostRequestDto; +import EBus.EBusback.global.SecurityUtil; +import lombok.RequiredArgsConstructor; + +@Service +@Transactional +@RequiredArgsConstructor +public class NoticeService { + + private final NoticeRepository noticeRepository; + + public NoticeResponseDto createNotice(PostRequestDto requestDto) { + Member member = SecurityUtil.getCurrentUser(); + if (!member.getRole().equals(Role.ADMIN)) + throw new RuntimeException("공지사항은 관리자만 작성 가능합니다."); + return new NoticeResponseDto(noticeRepository.save( + Notice.builder().title(requestDto.getTitle()).content(requestDto.getContent()).writer(member).build() + )); + } + + public NoticeResponseDto findNotice(Long noticeId) { + Notice notice = noticeRepository.findById(noticeId) + .orElseThrow(() -> new RuntimeException("공지사항을 찾을 수 없습니다.")); + return new NoticeResponseDto(notice); + } + + public List findNoticeList() { + return noticeRepository.findAll().stream() + .map(NoticeResponseDto::new).collect(Collectors.toList()); + } + + public void removeNotice(Long noticeId) { + Member member = SecurityUtil.getCurrentUser(); + Notice notice = noticeRepository.findById(noticeId) + .orElseThrow(() -> new RuntimeException("공지사항을 찾을 수 없습니다.")); + if (!member.getRole().equals(Role.ADMIN)) + throw new RuntimeException("관리자만 삭제할 수 있습니다."); + noticeRepository.delete(notice); + } +} diff --git a/src/main/java/EBus/EBusback/domain/post/controller/PostController.java b/src/main/java/EBus/EBusback/domain/post/controller/PostController.java new file mode 100644 index 0000000..700b8c0 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/controller/PostController.java @@ -0,0 +1,66 @@ +package EBus.EBusback.domain.post.controller; + +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import EBus.EBusback.domain.post.dto.PostCreateResponseDto; +import EBus.EBusback.domain.post.dto.PostDetailResponseDto; +import EBus.EBusback.domain.post.dto.PostOutlineResponseDto; +import EBus.EBusback.domain.post.dto.PostRequestDto; +import EBus.EBusback.domain.post.service.PostService; +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/posts") +public class PostController { + + private final PostService postService; + + @PostMapping("/suggestion") + @ResponseStatus(HttpStatus.CREATED) + public PostCreateResponseDto createSuggestion(@RequestBody PostRequestDto requestDto) { + return postService.createPost(requestDto, true); + } + + @PostMapping("/appreciation") + @ResponseStatus(HttpStatus.CREATED) + public PostCreateResponseDto createAppreciation(@RequestBody PostRequestDto requestDto) { + return postService.createPost(requestDto, false); + } + + @GetMapping("/{postId}") + @ResponseStatus(HttpStatus.OK) + public PostDetailResponseDto findPost(@PathVariable Long postId) { + return postService.findPost(postId); + } + + @GetMapping("/suggestion") + @ResponseStatus(HttpStatus.OK) + public List findSuggestionList() { + return postService.findPostList(true); + } + + @GetMapping("/appreciation") + @ResponseStatus(HttpStatus.OK) + public List findAppreciationList() { + return postService.findPostList(false); + } + + @DeleteMapping("/{postId}") + @ResponseStatus(HttpStatus.OK) + public String removePost(@PathVariable Long postId) { + postService.removePost(postId); + return "글이 삭제되었습니다."; + } + +} diff --git a/src/main/java/EBus/EBusback/domain/post/dto/PostCreateResponseDto.java b/src/main/java/EBus/EBusback/domain/post/dto/PostCreateResponseDto.java new file mode 100644 index 0000000..fd6f390 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/dto/PostCreateResponseDto.java @@ -0,0 +1,24 @@ +package EBus.EBusback.domain.post.dto; + +import java.time.LocalDateTime; + +import EBus.EBusback.domain.post.entity.Post; +import lombok.Getter; + +@Getter +public class PostCreateResponseDto { + + private Long postId; + private String title; + private String content; + private Boolean isSuggestion; + private LocalDateTime createdDate; + + public PostCreateResponseDto(Post post) { + this.postId = post.getPostId(); + this.title = post.getTitle(); + this.content = post.getContent(); + this.isSuggestion = post.getIsSuggestion(); + this.createdDate = post.getCreatedDate(); + } +} diff --git a/src/main/java/EBus/EBusback/domain/post/dto/PostDetailResponseDto.java b/src/main/java/EBus/EBusback/domain/post/dto/PostDetailResponseDto.java new file mode 100644 index 0000000..9aa6482 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/dto/PostDetailResponseDto.java @@ -0,0 +1,13 @@ +package EBus.EBusback.domain.post.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class PostDetailResponseDto { + + private PostCreateResponseDto post; + private Integer heartCount; + private PostMemberDto member; +} diff --git a/src/main/java/EBus/EBusback/domain/post/dto/PostMemberDto.java b/src/main/java/EBus/EBusback/domain/post/dto/PostMemberDto.java new file mode 100644 index 0000000..20a37aa --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/dto/PostMemberDto.java @@ -0,0 +1,12 @@ +package EBus.EBusback.domain.post.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class PostMemberDto { + + private Boolean hasHeart; + private Boolean isWriter; +} diff --git a/src/main/java/EBus/EBusback/domain/post/dto/PostOutlineResponseDto.java b/src/main/java/EBus/EBusback/domain/post/dto/PostOutlineResponseDto.java new file mode 100644 index 0000000..cbdbb47 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/dto/PostOutlineResponseDto.java @@ -0,0 +1,22 @@ +package EBus.EBusback.domain.post.dto; + +import java.time.LocalDateTime; + +import EBus.EBusback.domain.post.entity.Post; +import lombok.Getter; + +@Getter +public class PostOutlineResponseDto { + + private Long postId; + private String title; + private LocalDateTime createdDate; + private Integer heartCount; + + public PostOutlineResponseDto(Post post, Integer heartCount) { + this.postId = post.getPostId(); + this.title = post.getTitle(); + this.createdDate = post.getCreatedDate(); + this.heartCount = heartCount; + } +} diff --git a/src/main/java/EBus/EBusback/domain/post/dto/PostRequestDto.java b/src/main/java/EBus/EBusback/domain/post/dto/PostRequestDto.java new file mode 100644 index 0000000..938cf7e --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/dto/PostRequestDto.java @@ -0,0 +1,17 @@ +package EBus.EBusback.domain.post.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Getter; + +@Getter +public class PostRequestDto { + + @NotBlank + @Size(min = 1, max = 30) + private String title; + + @NotBlank + @Size(min = 1, max = 100) + private String content; +} diff --git a/src/main/java/EBus/EBusback/domain/post/entity/Post.java b/src/main/java/EBus/EBusback/domain/post/entity/Post.java index 7a360c8..2afa849 100644 --- a/src/main/java/EBus/EBusback/domain/post/entity/Post.java +++ b/src/main/java/EBus/EBusback/domain/post/entity/Post.java @@ -1,36 +1,57 @@ package EBus.EBusback.domain.post.entity; +import java.util.ArrayList; +import java.util.List; + +import EBus.EBusback.domain.heart.entity.Heart; import EBus.EBusback.domain.member.entity.Member; -import jakarta.persistence.*; -import lombok.*; +import EBus.EBusback.global.entity.BaseTimeEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Entity -@Getter @Setter +@Getter +@Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Post { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(nullable = false, updatable = false) - private Long postId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "writer_id", nullable = false) - private Member writer; - - @Column(nullable = false, length = 30) - private String title; - - @Column(nullable = false, length = 100) - private String content; - - @Column(nullable = false) - private Boolean isSuggestion; - - @Builder - public Post(Member writer, String title, String content, Boolean isSuggestion){ - this.writer = writer; - this.title = title; - this.content = content; - this.isSuggestion = isSuggestion; - } +public class Post extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(nullable = false, updatable = false) + private Long postId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "writer_id", nullable = false) + private Member writer; + + @Column(nullable = false, length = 30) + private String title; + + @Column(nullable = false, length = 100) + private String content; + + @Column(nullable = false) + private Boolean isSuggestion; + + @OneToMany(mappedBy = "post", orphanRemoval = true) + private List heartList = new ArrayList<>(); + + @Builder + public Post(Member writer, String title, String content, Boolean isSuggestion) { + this.writer = writer; + this.title = title; + this.content = content; + this.isSuggestion = isSuggestion; + } } diff --git a/src/main/java/EBus/EBusback/domain/post/repository/PostRepository.java b/src/main/java/EBus/EBusback/domain/post/repository/PostRepository.java new file mode 100644 index 0000000..d631914 --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/repository/PostRepository.java @@ -0,0 +1,12 @@ +package EBus.EBusback.domain.post.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import EBus.EBusback.domain.post.entity.Post; + +public interface PostRepository extends JpaRepository { + + List findAllByIsSuggestion(Boolean isSuggestion); +} diff --git a/src/main/java/EBus/EBusback/domain/post/service/PostService.java b/src/main/java/EBus/EBusback/domain/post/service/PostService.java new file mode 100644 index 0000000..1b742ad --- /dev/null +++ b/src/main/java/EBus/EBusback/domain/post/service/PostService.java @@ -0,0 +1,78 @@ +package EBus.EBusback.domain.post.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import EBus.EBusback.domain.heart.service.HeartService; +import EBus.EBusback.domain.member.entity.Member; +import EBus.EBusback.domain.post.dto.PostCreateResponseDto; +import EBus.EBusback.domain.post.dto.PostDetailResponseDto; +import EBus.EBusback.domain.post.dto.PostMemberDto; +import EBus.EBusback.domain.post.dto.PostOutlineResponseDto; +import EBus.EBusback.domain.post.dto.PostRequestDto; +import EBus.EBusback.domain.post.entity.Post; +import EBus.EBusback.domain.post.repository.PostRepository; +import EBus.EBusback.global.SecurityUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@Service +@Transactional +@RequiredArgsConstructor +public class PostService { + + private final PostRepository postRepository; + private final HeartService heartService; + + public PostCreateResponseDto createPost(PostRequestDto requestDto, Boolean isSuggestion) { + Member writer = SecurityUtil.getCurrentUser(); + Post post = postRepository.save( + Post.builder() + .title(requestDto.getTitle()) + .content(requestDto.getContent()) + .isSuggestion(isSuggestion) + .writer(writer) + .build() + ); + return new PostCreateResponseDto(post); + } + + public PostDetailResponseDto findPost(Long postId) { + Post post = postRepository.findById(postId) + .orElseThrow(() -> new IllegalArgumentException("글을 찾을 수 없습니다.")); + Member member = SecurityUtil.getCurrentUser(); + return new PostDetailResponseDto(new PostCreateResponseDto(post), post.getHeartList().size(), + findPostMemberInfo(post, member)); + } + + public PostMemberDto findPostMemberInfo(Post post, Member member) { + Boolean hasHeart = false; + Boolean isWriter = false; + + if (member != null) { + hasHeart = heartService.existsHeart(member, post); + isWriter = post.getWriter().getMemberId().equals(member.getMemberId()); + } + return new PostMemberDto(hasHeart, isWriter); + } + + public List findPostList(Boolean isSuggestion) { + List postList = postRepository.findAllByIsSuggestion(isSuggestion); + return postList.stream() + .map(post -> new PostOutlineResponseDto(post, post.getHeartList().size())) + .collect(Collectors.toList()); + } + + public void removePost(Long postId) { + Member member = SecurityUtil.getCurrentUser(); + Post post = postRepository.findById(postId) + .orElseThrow(() -> new IllegalArgumentException("글을 찾을 수 없습니다.")); + if (!post.getWriter().getMemberId().equals(member.getMemberId())) + throw new RuntimeException("작성자만 삭제할 수 있습니다."); + postRepository.delete(post); + } +} diff --git a/src/main/java/EBus/EBusback/global/SecurityUtil.java b/src/main/java/EBus/EBusback/global/SecurityUtil.java index 69dc318..cf9622d 100644 --- a/src/main/java/EBus/EBusback/global/SecurityUtil.java +++ b/src/main/java/EBus/EBusback/global/SecurityUtil.java @@ -10,7 +10,7 @@ public class SecurityUtil { public static Member getCurrentUser() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null || authentication.getPrincipal() == null) { - throw new RuntimeException("No authentication information"); + return null; } return (Member)authentication.getPrincipal(); }