Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/com/springboot/comment/Dto/CommentDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.springboot.comment.Dto;

public class CommentDto {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.springboot.comment.controller;

public class CommentController {
}
40 changes: 40 additions & 0 deletions src/main/java/com/springboot/comment/entity/Comment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.springboot.comment.entity;

import com.springboot.member.entity.Member;
import com.springboot.question.entity.Question;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import java.time.LocalDateTime;

@NoArgsConstructor
@Getter
@Setter
@Entity(name = "COMMENTS")
public class Comment {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long commentId;

@Column(length = 10, nullable = false)
private String createdBy;

@Column(nullable = false)
private LocalDateTime createdAt;

@Setter
@OneToOne
@JoinColumn(name = "POST_ID")
private Question question;

@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;

public void addMember(Member member) {
this.member = member;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.springboot.comment.repository;

import com.springboot.comment.entity.Comment;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CommentRepository extends JpaRepository<Comment, Long> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.springboot.comment.service;

public class CommentService {
}
13 changes: 13 additions & 0 deletions src/main/java/com/springboot/exception/BusinessLogicException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.springboot.exception;

import lombok.Getter;

public class BusinessLogicException extends RuntimeException {
@Getter
private ExceptionCode exceptionCode;

public BusinessLogicException(ExceptionCode exceptionCode) {
super(exceptionCode.getMessage());
this.exceptionCode = exceptionCode;
}
}
23 changes: 23 additions & 0 deletions src/main/java/com/springboot/exception/ExceptionCode.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.springboot.exception;

import lombok.Getter;

public enum ExceptionCode {
MEMBER_EXISTS("Member already exists"),
MEMBER_NOT_FOUND("Member not found"),
INVALID_VISIBILITY_STATUS("Choose either PUBLIC or SECRET"),
QUESTION_NOT_FOUND("Question not found"),
NO_PERMISSION_TO_VIEW("No permission to view"),
NO_PERMISSION_TO_DELETE("No permission to delete"),
NO_PERMISSION_TO_EDIT("No permission to edit"),
QUESTION_DELETED("Question deleted"),
QUESTION_ALREADY_DELETED("Question already deleted. Unable to view"),
QUESTION_CANNOT_BE_EDITED("Question already has a comment.Cannot be edited");

@Getter
private final String message;

ExceptionCode(String message) {
this.message = message;
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/springboot/member/Dto/MemberDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.springboot.member.Dto;

public class MemberDto {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.springboot.member.controller;

public class MemberController {
}
56 changes: 56 additions & 0 deletions src/main/java/com/springboot/member/entity/Member.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.springboot.member.entity;

import com.springboot.comment.entity.Comment;
import com.springboot.question.entity.Question;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@NoArgsConstructor
@Getter
@Setter
@Entity
public class Member {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long memberId;

@Column(nullable = false, updatable = false, unique = true)
private String email;

@Column(length = 100, nullable = false, updatable = false)
private String name;

@Column(length = 13, nullable = false, unique = true)
private String phone;

@ElementCollection(fetch = FetchType.EAGER)
private List<String> roles = new ArrayList<>();

@OneToMany(mappedBy = "member")
private List<Question> questions = new ArrayList<>();

@OneToMany(mappedBy = "member")
private List<Comment> comments = new ArrayList<>();

public Member(String email) {
this.email = email;
}

public Member(String email, String name, String phone) {
this.email = email;
this.name = name;
this.phone = phone;
}

public void addQuestions(Question question) {
questions.add(question);
}


}
6 changes: 6 additions & 0 deletions src/main/java/com/springboot/member/entity/Role.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.springboot.member.entity;

public enum Role {
ROLE_USER,
ROLE_ADMIN
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.springboot.member.repository;

import com.springboot.member.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByEmail(String email);
}
67 changes: 67 additions & 0 deletions src/main/java/com/springboot/member/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.springboot.member.service;

import com.springboot.exception.BusinessLogicException;
import com.springboot.exception.ExceptionCode;
import com.springboot.member.entity.Member;
import com.springboot.member.repository.MemberRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

@Service
public class MemberService {

private final MemberRepository memberRepository;

public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}

public Member createMember(Member member) {
verifyExistsEmail(member.getEmail());
member.setRoles(List.of("ROLE_USER"));
return memberRepository.save(member);
}

public Member updateMember(Member member) {
Member foundMember = findVerifiedMember(member.getMemberId());

Optional.ofNullable(member.getName())
.ifPresent(name -> foundMember.setName(name));
Optional.ofNullable(member.getPhone())
.ifPresent(phone -> foundMember.setPhone(phone));

return memberRepository.save(foundMember);
}

public Member findMember(Long memberId) {
return findVerifiedMember(memberId);
}

public Page<Member> findMembers(int page, int size) {
return memberRepository.findAll(PageRequest.of(page, size, Sort.by("memberId").descending()));

}

public void deleteMember(Long memberId) {
Member foundMember = findVerifiedMember(memberId);
memberRepository.delete(foundMember);
}

private void verifyExistsEmail(String email) {
Optional<Member> member = memberRepository.findByEmail(email);
if (member.isPresent())
throw new BusinessLogicException(ExceptionCode.MEMBER_EXISTS);
}

@Transactional(readOnly = true)
public Member findVerifiedMember(Long memberId) {
Optional<Member> member = memberRepository.findById(memberId);
return member.orElseThrow(() -> new BusinessLogicException(ExceptionCode.MEMBER_NOT_FOUND));
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/springboot/question/Dto/QuestionDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.springboot.question.Dto;

public class QuestionDto {
}
24 changes: 24 additions & 0 deletions src/main/java/com/springboot/question/Dto/QuestionRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.springboot.question.Dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class QuestionRequestDto {

public Long memberId;
public String title;
public String body;
private String visibilityStatus;

public QuestionRequestDto() {
}

public QuestionRequestDto(Long memberId, String title, String body, String visibilityStatus) {
this.memberId = memberId;
this.title = title;
this.body = body;
this.visibilityStatus = visibilityStatus;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.springboot.question.controller;

import com.springboot.question.Dto.QuestionRequestDto;
import com.springboot.question.service.QuestionService;
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;

@RestController
@RequestMapping("/questions")
public class QuestionController {

private final QuestionService questionService;

public QuestionController(QuestionService questionService) {
this.questionService = questionService;
}

@PostMapping
public void createQuestion(@RequestBody QuestionRequestDto questionRequestDto) {
questionService.createQuestion(questionRequestDto.getMemberId(), questionRequestDto.getTitle(), questionRequestDto.getBody(), questionRequestDto.getVisibilityStatus());
}
}
88 changes: 88 additions & 0 deletions src/main/java/com/springboot/question/entity/Question.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.springboot.question.entity;

import com.springboot.comment.entity.Comment;
import com.springboot.member.entity.Member;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.tomcat.jni.Local;

import javax.persistence.*;
import java.time.LocalDateTime;

@NoArgsConstructor
@Getter
@Setter
@Entity
public class Question {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long questionId;

@Column(length = 100, nullable = false)
private String title;

@Column(length = 2000, nullable = false)
private String body;

@Column(length = 20, nullable = false)
private String createdBy;

@Column(nullable = false)
private LocalDateTime createdAt = LocalDateTime.now();

@Column(nullable = false)
private LocalDateTime updatedAt = LocalDateTime.now();

@Enumerated(value = EnumType.STRING)
@Column(length = 20, nullable = false)
private QuestionStatus questionStatus = QuestionStatus.QUESTION_REGISTERED;

@Column(nullable = false)
private int viewCount;

@Column(nullable = false)
private Boolean isSecret = false;

@Column(nullable = false)
private Boolean isNew;

@OneToOne(cascade = CascadeType.PERSIST)
private Comment comment;

@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;

public void addMember(Member member) {
this.member = member;
}

public enum QuestionStatus {
QUESTION_REGISTERED("질문 등록 상태"),
QUESTION_ANSWERED("답변 완료 상태"),
QUESTION_DELETED("질문 삭제 상태"),
QUESTION_DEACTIVATED("질문 비활성화 상태");

@Getter
private String status;

QuestionStatus(String status) {
this.status = status;
}
}

@Enumerated(EnumType.STRING)
private VisibilityStatus visibilityStatus;

public enum VisibilityStatus {
PUBLIC,
SECRET
}

public void addComment(Comment comment) {
this.comment = comment;
comment.setQuestion(this);
}
}
Loading