Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…eview-me into fe/ci/85-build-ci
  • Loading branch information
ImxYJL committed Jul 25, 2024
2 parents eb374c2 + 21447e1 commit bbbb08e
Show file tree
Hide file tree
Showing 122 changed files with 2,379 additions and 904 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/backend-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ on:
pull_request:
branches:
- develop
paths:
- 'backend/**'

jobs:
build:
Expand Down
16 changes: 16 additions & 0 deletions backend/src/main/java/reviewme/config/CorsConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package reviewme.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("*")
.allowedOrigins("*");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,24 @@

import java.util.List;
import java.util.Map;
import org.springframework.beans.TypeMismatchException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ProblemDetail;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.method.MethodValidationException;
import org.springframework.web.HttpMediaTypeException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.HandlerMethodValidationException;
import org.springframework.web.multipart.support.MissingServletRequestPartException;
import org.springframework.web.server.MissingRequestValueException;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.resource.NoResourceFoundException;
import reviewme.global.exception.BadRequestException;
import reviewme.global.exception.FieldErrorResponse;
import reviewme.global.exception.NotFoundException;

Expand All @@ -18,8 +31,50 @@ public ProblemDetail handleNotFoundException(NotFoundException ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getErrorMessage());
}

@ExceptionHandler(BadRequestException.class)
public ProblemDetail handleBadRequestException(BadRequestException ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, ex.getErrorMessage());
}

@ExceptionHandler(Exception.class)
public ProblemDetail handleException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.INTERNAL_SERVER_ERROR, "서버 에러가 발생했습니다.");
}

// Following exceptions are exceptions that occur in Spring
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ProblemDetail handleHttpRequestMethodNotSupportedException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.METHOD_NOT_ALLOWED, "지원하지 않는 HTTP 메서드입니다.");
}

@ExceptionHandler(HttpMediaTypeException.class)
public ProblemDetail handleHttpMediaTypeException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.UNSUPPORTED_MEDIA_TYPE, "잘못된 media type 입니다.");
}

@ExceptionHandler({MissingRequestValueException.class, MissingServletRequestPartException.class})
public ProblemDetail handleMissingRequestException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, "필수 요청 데이터가 누락되었습니다.");
}

@ExceptionHandler({ServletRequestBindingException.class, HttpMessageNotReadableException.class})
public ProblemDetail handleServletRequestBindingException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, "요청을 읽을 수 없습니다.");
}

@ExceptionHandler({MethodValidationException.class, BindException.class,
TypeMismatchException.class, HandlerMethodValidationException.class})
public ProblemDetail handleRequestFormatException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, "요청의 형식이 잘못되었습니다.");
}

@ExceptionHandler({NoHandlerFoundException.class, NoResourceFoundException.class})
public ProblemDetail handleNoHandlerFoundException(Exception ex) {
return ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, "잘못된 경로의 요청입니다.");
}

@ExceptionHandler(MethodArgumentNotValidException.class)
public ProblemDetail handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
public ProblemDetail handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
List<FieldErrorResponse> fieldErrors = ex.getBindingResult()
.getFieldErrors()
.stream()
Expand Down
16 changes: 0 additions & 16 deletions backend/src/main/java/reviewme/keyword/contoller/KeywordApi.java

This file was deleted.

This file was deleted.

17 changes: 6 additions & 11 deletions backend/src/main/java/reviewme/keyword/domain/Keyword.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,11 @@ public class Keyword {
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "detail", nullable = false)
private String detail;
@Column(name = "content", nullable = false)
private String content;

Keyword(Long id, String detail) {
this.id = id;
this.detail = detail;
}

public Keyword(String detail) {
this(null, detail);
public Keyword(String content) {
this.content = content;
}

@Override
Expand All @@ -42,15 +37,15 @@ public boolean equals(Object o) {
return false;
}
if (id == null) {
return Objects.equals(detail, keyword.detail);
return Objects.equals(content, keyword.content);
}
return Objects.equals(id, keyword.id);
}

@Override
public int hashCode() {
if (id == null) {
return Objects.hash(detail);
return Objects.hash(content);
}
return Objects.hash(id);
}
Expand Down
50 changes: 50 additions & 0 deletions backend/src/main/java/reviewme/keyword/domain/Keywords.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package reviewme.keyword.domain;

import jakarta.persistence.CollectionTable;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embeddable;
import jakarta.persistence.JoinColumn;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import reviewme.keyword.domain.exception.DuplicateKeywordException;
import reviewme.keyword.domain.exception.KeywordLimitExceedException;

@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Keywords {

private static final int MAX_KEYWORD_COUNT = 5;

@ElementCollection
@CollectionTable(name = "review_keyword", joinColumns = @JoinColumn(name = "review_id"))
private Set<Long> keywordIds;

public Keywords(List<Keyword> selectedKeywords) {
if (selectedKeywords.size() > MAX_KEYWORD_COUNT) {
throw new KeywordLimitExceedException(MAX_KEYWORD_COUNT);
}
if (hasDuplicateKeywords(selectedKeywords)) {
throw new DuplicateKeywordException();
}
this.keywordIds = selectedKeywords.stream()
.map(Keyword::getId)
.collect(Collectors.toSet());
}

private boolean hasDuplicateKeywords(List<Keyword> selectedKeywords) {
long distinctKeywordCount = selectedKeywords.stream()
.distinct()
.count();
return selectedKeywords.size() != distinctKeywordCount;
}

public Set<Long> getKeywordIds() {
return Collections.unmodifiableSet(keywordIds);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class KeywordService {
public KeywordsResponse findAllKeywords() {
List<KeywordResponse> responses = keywordRepository.findAll()
.stream()
.map(keyword -> new KeywordResponse(keyword.getId(), keyword.getDetail()))
.map(keyword -> new KeywordResponse(keyword.getId(), keyword.getContent()))
.toList();
return new KeywordsResponse(responses);
}
Expand Down
22 changes: 22 additions & 0 deletions backend/src/main/java/reviewme/member/domain/GithubId.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package reviewme.member.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Embeddable
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = "id")
@Getter
public class GithubId {

@Column(name = "github_id", nullable = false)
private long id;

public GithubId(long id) {
this.id = id;
}
}
Original file line number Diff line number Diff line change
@@ -1,35 +1,33 @@
package reviewme.member.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
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 lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "github_reviewer_group")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = "id")
@Getter
public class GithubReviewerGroup {
public class GithubIdReviewerGroup {

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

@Column(name = "github_id", nullable = false)
private String githubId;
@Embedded
private GithubId githubId;

@ManyToOne
@JoinColumn(name = "reviewer_group_id")
private ReviewerGroup reviewerGroup;

public GithubReviewerGroup(String githubId, ReviewerGroup reviewerGroup) {
public GithubIdReviewerGroup(GithubId githubId, ReviewerGroup reviewerGroup) {
this.githubId = githubId;
this.reviewerGroup = reviewerGroup;
}
Expand Down
32 changes: 28 additions & 4 deletions backend/src/main/java/reviewme/member/domain/Member.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package reviewme.member.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.util.Objects;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -23,11 +25,33 @@ public class Member {
@Column(name = "name", nullable = false)
private String name;

@Column(name = "github_id", nullable = false)
private String githubId;
@Embedded
private GithubId githubId;

public Member(String name, String githubId) {
public Member(String name, long githubId) {
this.name = name;
this.githubId = githubId;
this.githubId = new GithubId(githubId);
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Member member)) {
return false;
}
if (id == null) {
return Objects.equals(githubId, member.githubId);
}
return Objects.equals(id, member.id);
}

@Override
public int hashCode() {
if (id == null) {
return Objects.hash(githubId);
}
return Objects.hash(id);
}
}
Loading

0 comments on commit bbbb08e

Please sign in to comment.