Skip to content

Commit

Permalink
Merge pull request #52 from Sopo2023/feat/#50
Browse files Browse the repository at this point in the history
chore: 회원탈퇴
  • Loading branch information
GayeongKimm authored Aug 1, 2024
2 parents a844ead + 0c2437b commit 52c27f9
Show file tree
Hide file tree
Showing 20 changed files with 697 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package kr.hs.dgsw.SOPO_server_v2.domain.board.controller;

import kr.hs.dgsw.SOPO_server_v2.domain.board.dto.BoardLoadRes;
import kr.hs.dgsw.SOPO_server_v2.domain.board.dto.BoardUpdateReq;
import kr.hs.dgsw.SOPO_server_v2.domain.board.service.BoardService;
import kr.hs.dgsw.SOPO_server_v2.global.response.Response;
import kr.hs.dgsw.SOPO_server_v2.global.response.ResponseData;
import lombok.RequiredArgsConstructor;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/board")
@RequiredArgsConstructor
public class BoardController {
private final BoardService boardService;

@GetMapping("/all")
public ResponseData<List<BoardLoadRes>> getBoards() {
return boardService.getBoards();
}

@PostMapping
public ResponseData<Long> createBoard() {
return boardService.createBoard();
}

@GetMapping
public ResponseData<BoardLoadRes> getBoard(Long boardId) {
return boardService.findOneBoard(boardId);
}

@PatchMapping
public Response loadBoard(Long boardId, BoardUpdateReq updateReq) {
return boardService.loadBoard(boardId, updateReq);
}

@DeleteMapping
public Response deleteBoard(Long boardId) {
return boardService.deleteBoard(boardId);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.hs.dgsw.SOPO_server_v2.domain.board.repository;

import kr.hs.dgsw.SOPO_server_v2.domain.board.entity.BoardEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package kr.hs.dgsw.SOPO_server_v2.domain.board.service;

import jakarta.transaction.Transactional;
import kr.hs.dgsw.SOPO_server_v2.domain.board.dto.BoardLoadRes;
import kr.hs.dgsw.SOPO_server_v2.domain.board.dto.BoardUpdateReq;
import kr.hs.dgsw.SOPO_server_v2.domain.board.entity.BoardEntity;
import kr.hs.dgsw.SOPO_server_v2.domain.board.repository.BoardRepository;
import kr.hs.dgsw.SOPO_server_v2.domain.member.entity.MemberEntity;
import kr.hs.dgsw.SOPO_server_v2.domain.member.enums.MemberCategory;
import kr.hs.dgsw.SOPO_server_v2.global.error.custom.board.BoardNotFound;
import kr.hs.dgsw.SOPO_server_v2.global.error.custom.member.MemberNotCoincideException;
import kr.hs.dgsw.SOPO_server_v2.global.infra.security.GetCurrentMember;
import kr.hs.dgsw.SOPO_server_v2.global.response.ResponseData;
import kr.hs.dgsw.SOPO_server_v2.global.response.Response;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Transactional
@RequiredArgsConstructor
public class BoardService {

private final BoardRepository boardRepository;
private final GetCurrentMember getCurrentMember;

// 게시글 전체 조회
public ResponseData<List<BoardLoadRes>> getBoards() {
List<BoardEntity> boardList = boardRepository.findAll();
List<BoardLoadRes> boardLoadResList = boardList.stream().map(
BoardLoadRes::of
).toList();

return ResponseData.of(HttpStatus.OK, "게시물 전체 조회 완료", boardLoadResList);
}

// 빈 게시글 생성
public ResponseData<Long> createBoard() {
MemberEntity curMember = getCurrentMember.current();

BoardEntity board = BoardEntity.builder()
.boardTitle(null)
.boardContent(null)
.file(null)
.member(curMember)
.build();

return ResponseData.of(HttpStatus.OK, "빈 게시물 생성 완료", board.getBoardId());
}

// 게시글 업데이트
public Response loadBoard(Long boardId, BoardUpdateReq updateReq) {
MemberEntity curMember = getCurrentMember.current();

BoardEntity board = boardRepository.findById(boardId)
.orElseThrow(() -> BoardNotFound.EXCEPTION);

// 만약 현재 로그인 유저와 Load 하려는 유저가 다르고, admin 아니라면
if (!board.getMember().getMemberId().equals(curMember.getMemberId()) && curMember.getMemberCategory() == MemberCategory.USER) {
throw MemberNotCoincideException.EXCEPTION;
}

board.update(updateReq);
return Response.of(HttpStatus.OK, "게시물 업데이트 완료");
}

// 게시글 단일 조회
public ResponseData<BoardLoadRes> findOneBoard(Long boardId) {
BoardEntity board = boardRepository.findById(boardId)
.orElseThrow(() -> BoardNotFound.EXCEPTION);
BoardLoadRes boardLoadRes = BoardLoadRes.of(board);
return ResponseData.of(HttpStatus.OK, "게시물 단일 조회 완료", boardLoadRes);
}

// 게시글 삭제
@Transactional
public Response deleteBoard(Long boardId) {
MemberEntity curMember = getCurrentMember.current();

BoardEntity board = boardRepository.findById(boardId)
.orElseThrow(() -> BoardNotFound.EXCEPTION);

// 만약 만든 사람과 삭제하려는 사람이 일치하지 않고 admin 아니라면.. error
if (!board.getMember().getMemberId().equals(curMember.getMemberId()) && curMember.getMemberCategory() == MemberCategory.USER) {
throw MemberNotCoincideException.EXCEPTION;
}

boardRepository.deleteById(boardId);
return Response.of(HttpStatus.OK, "게시물 삭제 완료");
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package kr.hs.dgsw.SOPO_server_v2.domain.comment.entity;

import jakarta.persistence.CascadeType;
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 jakarta.persistence.Table;
import kr.hs.dgsw.SOPO_server_v2.domain.board.entity.BoardEntity;
import kr.hs.dgsw.SOPO_server_v2.domain.member.entity.MemberEntity;
import kr.hs.dgsw.SOPO_server_v2.global.common.entity.BaseTimeEntity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

import java.util.ArrayList;
import java.util.List;

@Getter
@Entity
@Table(name = "tbl_comment")
@NoArgsConstructor
@DynamicUpdate
@ToString
@SuperBuilder
public class CommentEntity extends BaseTimeEntity { // 부모

// 댓글 아이디
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "comment_id")
private Long commentId;

// 댓글 내용
@Column(name = "comment_content")
private String commentContent;

// 자식 댓글
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<SubCommentEntity> children = new ArrayList<>();

// 게시물 아이디
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "board_id", nullable = false)
private BoardEntity board;

// 유저 아이디
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private MemberEntity member;


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package kr.hs.dgsw.SOPO_server_v2.domain.comment.entity;

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.Table;
import kr.hs.dgsw.SOPO_server_v2.domain.member.entity.MemberEntity;
import kr.hs.dgsw.SOPO_server_v2.global.common.entity.BaseTimeEntity;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

@Getter
@Entity
@Table(name = "tbl_sub_comment")
@NoArgsConstructor
@DynamicUpdate
@SuperBuilder
public class SubCommentEntity extends BaseTimeEntity {

// 대댓글 아이디
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long subCommentId;

// 대댓글 내용
private String content;

// 부모 댓글
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private CommentEntity parent;

// 유저 아이디
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
private MemberEntity member;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package kr.hs.dgsw.SOPO_server_v2.domain.contest.controller;

import kr.hs.dgsw.SOPO_server_v2.domain.contest.dto.ContestLoadRes;
import kr.hs.dgsw.SOPO_server_v2.domain.contest.dto.ContestUpdateReq;
import kr.hs.dgsw.SOPO_server_v2.domain.contest.service.ContestService;
import kr.hs.dgsw.SOPO_server_v2.global.response.Response;
import kr.hs.dgsw.SOPO_server_v2.global.response.ResponseData;
import lombok.RequiredArgsConstructor;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/contest")
@RequiredArgsConstructor
public class ContestController {
private final ContestService contestService;

@GetMapping("/all")
public ResponseData<List<ContestLoadRes>> getContests() {
return contestService.getContests();
}

@PostMapping
public ResponseData<Long> createContest() {
return contestService.createContest();
}

@GetMapping
public ResponseData<ContestLoadRes> getContest(Long contestId) {
return contestService.findOneContest(contestId);
}

@PatchMapping
public Response loadContest(Long contestId, ContestUpdateReq updateReq) {
return contestService.loadContest(contestId, updateReq);
}

@DeleteMapping
public Response deleteContest(Long contestId) {
return contestService.deleteContest(contestId);
}

@PatchMapping("/state")
public Response changeContestState(Long contestId) {
return contestService.changeContestState(contestId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,4 +86,11 @@ public void likeUpdate(int contestLikeCount) {
this.contestLikeCount += contestLikeCount;
}

public void stateUpdateActive() {
this.contestState = ContestState.ACTIVE;
}

public void stateUpdateDisabled() {
this.contestState = ContestState.DISABLED;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.hs.dgsw.SOPO_server_v2.domain.contest.repository;

import kr.hs.dgsw.SOPO_server_v2.domain.contest.entity.ContestEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ContestRepository extends JpaRepository<ContestEntity, Long> {
}
Loading

0 comments on commit 52c27f9

Please sign in to comment.