Skip to content

Commit

Permalink
release: v1.5.2
Browse files Browse the repository at this point in the history
  • Loading branch information
nailseong authored Nov 18, 2022
2 parents 8c6c816 + f72ec02 commit 9e4977a
Show file tree
Hide file tree
Showing 47 changed files with 475 additions and 255 deletions.
5 changes: 5 additions & 0 deletions .github/workflows/front-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,8 @@ jobs:
- name: Prod Build # React Prod Build
working-directory: ./frontend
run: yarn build-prod

sonarqube-build:
runs-on: ubuntu-22.04
steps:
- run: 'echo "No build required"'
3 changes: 1 addition & 2 deletions .github/workflows/front-unit-test.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: frontend Unit Test # Workflow 이름
name: frontend Common CI # Workflow 이름

# 하기 내용에 해당하는 이벤트 발생 시 github action 동작
on:
Expand Down Expand Up @@ -30,7 +30,6 @@ jobs:
key: ${{ runner.os }}-node-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install Dependencies # 의존 파일 설치
if: steps.cache.outputs.cache-hit != 'true'
working-directory: ./frontend
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ public LoginResponse login(final GithubProfileResponse githubProfile) {
}

private Long getMemberIdByGithubProfile(final GithubProfileResponse githubProfile) {
final int githubId = Integer.parseInt(githubProfile.getGithubId());

return memberService.saveIfNotExist(githubProfile, githubId);
return memberService.saveIfNotExist(githubProfile);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,20 @@ public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response,
final Object handler) {
if (isPreFlightRequest(request)) {
return true;
}

if (isPublicAPI((HandlerMethod) handler)) {
return true;
if (requireTokenValidation(request, handler)) {
validateToken(request);
}
return true;
}

final String token = AuthorizationExtractor.extract(request);
if (!jwtTokenProvider.validateToken(token)) {
throw new InvalidTokenException(DebugMessage.init().append("token", token));
private boolean requireTokenValidation(
final HttpServletRequest request,
final Object handler
) {
if (isPreFlightRequest(request)) {
return false;
}

return true;
return !isPublicAPI((HandlerMethod) handler);
}

private boolean isPublicAPI(final HandlerMethod handler) {
Expand All @@ -48,4 +48,11 @@ private boolean isPublicAPI(final HandlerMethod handler) {

return isPublicClass || isPublicMethod;
}

private void validateToken(final HttpServletRequest request) {
final String token = AuthorizationExtractor.extract(request);
if (!jwtTokenProvider.validateToken(token)) {
throw new InvalidTokenException(DebugMessage.init().append("token", token));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -11,7 +10,6 @@
* Github OAuth로부터 access token을 받기 위한 dto 더 적절한 이름있으면 고쳐주세요.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor
@Getter
@EqualsAndHashCode
public class GithubTokenResponse {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class ControllerAdvice {

@ExceptionHandler(LevellogException.class)
public ResponseEntity<ExceptionResponse> handleLevellogException(final LevellogException e) {
log.info("{} : {}", ((Exception) e).getClass().getSimpleName(), e.getMessage());
log.info("{} : {}", e.getClass().getSimpleName(), e.getMessage());
return toResponseEntity(e.getClientMessage(), e.getHttpStatus());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ public Long save(final FeedbackWriteRequest request, final Long levellogId,
@Verified final LoginStatus loginStatus) {
final Long memberId = loginStatus.getMemberId();

validateExistence(levellogId, memberId);

final Levellog levellog = levellogRepository.getLevellog(levellogId);
validateExistence(levellog, memberId);

final Team team = levellog.getTeam();

levellog.validateSelfFeedback(memberId);
Expand Down Expand Up @@ -89,10 +89,10 @@ public void update(final FeedbackWriteRequest request, final Long feedbackId,
request.getFeedback().getEtc());
}

private void validateExistence(final Long levellogId, final Long fromMemberId) {
if (feedbackRepository.existsByLevellogIdAndFromId(levellogId, fromMemberId)) {
private void validateExistence(final Levellog levellog, final Long fromMemberId) {
if (feedbackRepository.existsByLevellogAndFromId(levellog, fromMemberId)) {
throw new FeedbackAlreadyExistException(DebugMessage.init()
.append("levellogId", levellogId));
.append("levellogId", levellog.getId()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,20 @@
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(uniqueConstraints = {
@UniqueConstraint(
name = "uk_feedback_author_id_team_id",
columnNames = {"fromId", "levellog_id"}
)})
public class Feedback extends BaseEntity {

private static final String CONTENT_TYPE_SPEAK = "Speak";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,14 @@

import com.woowacourse.levellog.common.support.DebugMessage;
import com.woowacourse.levellog.feedback.exception.FeedbackNotFoundException;
import javax.persistence.LockModeType;
import com.woowacourse.levellog.levellog.domain.Levellog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.stereotype.Repository;

@Repository
public interface FeedbackRepository extends JpaRepository<Feedback, Long> {

@Lock(LockModeType.PESSIMISTIC_WRITE)
boolean existsByLevellogIdAndFromId(Long levellogId, Long fromId);
boolean existsByLevellogAndFromId(Levellog levellog, Long fromId);

default Feedback getFeedback(final Long feedbackId) {
return findById(feedbackId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.woowacourse.levellog.feedback.dto.request;

import com.woowacourse.levellog.feedback.domain.Feedback;
import com.woowacourse.levellog.levellog.domain.Levellog;
import javax.validation.constraints.NotNull;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
Expand All @@ -23,8 +21,4 @@ public class FeedbackContentRequest {

@NotNull
private String etc;

public Feedback toEntity(final Long fromId, final Levellog levellog) {
return new Feedback(fromId, levellog, study, speak, etc);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
@Getter
@Table(uniqueConstraints = {
@UniqueConstraint(
name = "uk_interview_question_id_liker_id",
name = "uk_interview_question_likes_interview_question_id_liker_id",
columnNames = {"interviewQuestionId", "likerId"}
)})
public class InterviewQuestionLikes extends BaseEntity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public Long save(final LevellogWriteRequest request, @Verified final LoginStatus

team.validateReady(timeStandard.now());
team.validateIsParticipants(authorId);
validateLevellogExistence(authorId, teamId);
validateLevellogExistence(authorId, team);

final Levellog savedLevellog = levellogRepository.save(request.toLevellog(authorId, team));

Expand Down Expand Up @@ -69,12 +69,12 @@ public void update(final LevellogWriteRequest request, final Long levellogId,
levellog.updateContent(loginStatus.getMemberId(), request.getContent());
}

private void validateLevellogExistence(final Long authorId, final Long teamId) {
final boolean isExists = levellogRepository.existsByAuthorIdAndTeamId(authorId, teamId);
private void validateLevellogExistence(final Long authorId, final Team team) {
final boolean isExists = levellogRepository.existsByAuthorIdAndTeam(authorId, team);
if (isExists) {
throw new LevellogAlreadyExistException(DebugMessage.init()
.append("authorId", authorId)
.append("teamId", teamId));
.append("teamId", team.getId()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,20 @@
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(uniqueConstraints = {
@UniqueConstraint(
name = "uk_levellog_author_id_team_id",
columnNames = {"authorId", "team_id"}
)})
public class Levellog extends BaseEntity {

@Column(nullable = false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

import com.woowacourse.levellog.common.support.DebugMessage;
import com.woowacourse.levellog.levellog.exception.LevellogNotFoundException;
import com.woowacourse.levellog.team.domain.Team;
import java.util.List;
import java.util.Optional;
import javax.persistence.LockModeType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;

public interface LevellogRepository extends JpaRepository<Levellog, Long> {
Expand All @@ -19,8 +18,7 @@ default Levellog getLevellog(final Long levellogId) {

Optional<Levellog> findByAuthorIdAndTeamId(Long authorId, Long teamId);

@Lock(LockModeType.PESSIMISTIC_WRITE)
boolean existsByAuthorIdAndTeamId(Long authorId, Long teamId);
boolean existsByAuthorIdAndTeam(Long authorId, Team team);

@Query("SELECT l FROM Levellog l INNER JOIN FETCH l.team WHERE l.authorId = :authorId")
List<Levellog> findAllByAuthorId(Long authorId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ public Long save(final MemberCreateRequest request) {
}

@Transactional
public Long saveIfNotExist(final GithubProfileResponse request, final int githubId) {
// TODO githubId를 안받아도 될듯? GithubProfileResponse에 이미 정보가 존재함. + save의 예외 발생을 이용하면 로직 간단해질듯
final boolean isExist = memberRepository.existsByGithubId(githubId);
if (isExist) {
public Long saveIfNotExist(final GithubProfileResponse request) {
final int githubId = getGithubId(request);
if (existsGithubId(githubId)) {
return getByGithubId(githubId).getId();
}

return save(new MemberCreateRequest(request.getNickname(), githubId, request.getProfileUrl()));
return save(
new MemberCreateRequest(request.getNickname(), githubId, request.getProfileUrl()));
}

public MemberResponse findMemberById(final LoginStatus loginStatus) {
Expand All @@ -66,19 +66,27 @@ public MemberResponses searchByNickname(final String nickname) {
}

@Transactional
public void updateNickname(final NicknameUpdateRequest request, @Verified final LoginStatus loginStatus) {
public void updateNickname(final NicknameUpdateRequest request,
@Verified final LoginStatus loginStatus) {
final Member member = memberRepository.getMember(loginStatus.getMemberId());
member.updateNickname(request.getNickname());
}

private int getGithubId(final GithubProfileResponse request) {
return Integer.parseInt(request.getGithubId());
}

private void checkSameGithubId(final MemberCreateRequest request) {
final boolean isExistSameGithubId = memberRepository.existsByGithubId(request.getGithubId());
if (isExistSameGithubId) {
if (existsGithubId(request.getGithubId())) {
throw new MemberAlreadyExistException(DebugMessage.init()
.append("githubId", request.getGithubId()));
}
}

private boolean existsGithubId(final int githubId) {
return memberRepository.existsByGithubId(githubId);
}

private Member createMember(final MemberCreateRequest request) {
final Member member = request.toEntity();
final Optional<NicknameMapping> nickname = nicknameMappingRepository.findByGithubNickname(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(uniqueConstraints = {@UniqueConstraint(name = "uk_member_github_id", columnNames = {"githubId"})})
@Table(uniqueConstraints = {
@UniqueConstraint(
name = "uk_member_github_id",
columnNames = {"githubId"}
)})
public class Member extends BaseEntity {

private static final int NICKNAME_MAX_LENGTH = 50;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,14 @@
import com.woowacourse.levellog.member.exception.MemberNotFoundException;
import java.util.List;
import java.util.Optional;
import javax.persistence.LockModeType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;

public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByGithubId(int githubId);

List<Member> findAllByNicknameContains(String nickname);

@Lock(LockModeType.PESSIMISTIC_WRITE)
boolean existsByGithubId(int githubId);

default Member getMember(final Long memberId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,20 @@
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(uniqueConstraints = {
@UniqueConstraint(
name = "uk_pre_question_levellog_id_author_id",
columnNames = {"levellog_id", "authorId"}
)})
public class PreQuestion extends BaseEntity {

@ManyToOne(fetch = FetchType.LAZY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,10 @@
import com.woowacourse.levellog.common.support.DebugMessage;
import com.woowacourse.levellog.levellog.domain.Levellog;
import com.woowacourse.levellog.prequestion.exception.PreQuestionNotFoundException;
import javax.persistence.LockModeType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;

public interface PreQuestionRepository extends JpaRepository<PreQuestion, Long> {

@Lock(LockModeType.PESSIMISTIC_WRITE)
boolean existsByLevellogAndAuthorId(Levellog levellog, Long authorId);

default PreQuestion getPreQuestion(final Long preQuestionId) {
Expand Down
1 change: 1 addition & 0 deletions backend/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ spring:
hibernate:
dialect: org.hibernate.dialect.MariaDBDialect
format_sql: true
open-in-view: false

security:
github:
Expand Down
Loading

0 comments on commit 9e4977a

Please sign in to comment.