Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] 운영 서버 배포 #568

Merged
merged 50 commits into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
4c73345
refactor: #501 Todo 도메인 레포지토리 구조를 팀 컨벤션에 맞춰 변경
kelly6bf Sep 19, 2024
0a8a753
feat: 나의 페어룸 조회 API 구현
yechop Sep 19, 2024
646d2f3
refactor: #501 Todo 기본 간격 ㄱ밧 변경 및 sort 값에 음수 허용하도록 변경
kelly6bf Sep 19, 2024
065bb5d
refactor: TodoSort 검증 로직 추가
kelly6bf Sep 19, 2024
481d78c
fix: 컨플릭트 resolve
reddevilmidzy Sep 20, 2024
7414463
fix: 컴파일에러 해결
reddevilmidzy Sep 20, 2024
64f5bdc
feat: todoService에 @Transactional 추가
reddevilmidzy Sep 20, 2024
2be74df
refactor: TodoEntity 생성자에 PairRoomEntity 바로 주입받을 수 있도록 변경
reddevilmidzy Sep 20, 2024
b57219b
refactor: todo 도메인에서 pairRoom 제거
reddevilmidzy Sep 20, 2024
800337e
fix: @PathVariable에 name 추가
JiHyeonL Sep 20, 2024
e76c92a
fix: todo 도메인 -> 엔티티 변환시 pairRoomEntity 추가
JiHyeonL Sep 20, 2024
786fc7c
refactor: 페어룸 테이블 id 컬럼명 pair_room -> pair_room_id 로 수정
JiHyeonL Sep 20, 2024
25b8c22
Merge branch 'BE/dev' into BE/feature/#501-todo_bug
JiHyeonL Sep 20, 2024
9815d5a
feat: 로그인 유저 및 로그인하지 않은 유저의 페어룸 생성 메서드 분리
reddevilmidzy Sep 22, 2024
7a7a9f2
refactor: 중복되는 부분 메서드 분리
reddevilmidzy Sep 22, 2024
3f01c35
fix: 테스트 변수의 오타 수정
reddevilmidzy Sep 22, 2024
abaee20
test: 테스트에서 테이블 truncate 할 때 pairRoomMember 테이블도 추가
reddevilmidzy Sep 22, 2024
c5c31c6
refactor: service 메서드에서 중복되는 부분 분리
reddevilmidzy Sep 22, 2024
0dd2f7a
Merge branch 'BE/dev' into BE/feature/#507-show-pairroom
reddevilmidzy Sep 22, 2024
144f0d7
test: AcceptanceFixture 의 tearDown 메서드에 pairRoomMemberRepository 추가
JiHyeonL Sep 22, 2024
5381ccd
style: final 누락 추가
reddevilmidzy Sep 23, 2024
30b5ca4
refactor: 필드의 컬럼명 명시
reddevilmidzy Sep 23, 2024
ce06929
style: 공백 제거
reddevilmidzy Sep 23, 2024
1ee185c
style: final 누락 추가
reddevilmidzy Sep 23, 2024
7095b23
docs: 문서화 추가
reddevilmidzy Sep 23, 2024
a91971c
docs: #501 Todo 도메인 API 문서화
kelly6bf Sep 23, 2024
de1e36d
Merge branch 'BE/dev' into BE/feature/#507-show-pairroom
reddevilmidzy Sep 24, 2024
bcb3735
test: member 조회 테스트 추가
reddevilmidzy Sep 24, 2024
81af7a5
refactor: 토큰으로 로그인 여부 판단을 service 계층으로 이동
reddevilmidzy Sep 24, 2024
d897cc5
fix: todo 컨트롤러에 @PathVariable 설정 추가
reddevilmidzy Sep 24, 2024
88223ec
Merge remote-tracking branch 'origin/BE/feature/#507-show-pairroom' i…
reddevilmidzy Sep 24, 2024
ab078e8
refactor: pairRoomMember 패키지 제거 후 pairRoom으로 이동
reddevilmidzy Sep 24, 2024
53c58b6
test: 페어룸 전체 조회 테스트 메서드 분리 및 리팩터링
reddevilmidzy Sep 24, 2024
7550623
Merge branch 'BE/dev' into BE/feature/#507-show-pairroom
reddevilmidzy Sep 24, 2024
460c47d
fix: 컨플릭트 해결
reddevilmidzy Sep 24, 2024
b111f98
Update be_cd-test.yml
koust6u Sep 24, 2024
9e27afd
Update be_app-docker-compose.yml
kelly6bf Sep 24, 2024
0deb39b
Update be_cd-test.yml
kelly6bf Sep 24, 2024
5222f22
Update be_cd-test.yml
kelly6bf Sep 24, 2024
f0c7550
Update be_app-docker-compose.yml
kelly6bf Sep 24, 2024
502d7d1
Update be_cd-test.yml
kelly6bf Sep 24, 2024
880a455
액추에이터 앤드포인트 재설정 (#563)
koust6u Sep 25, 2024
2f40172
Merge pull request #540 from woowacourse-teams/BE/feature/#507-show-p…
reddevilmidzy Sep 25, 2024
1bf545b
fix: 컨플릭트 해결
reddevilmidzy Sep 25, 2024
f7cd170
style: static import 사용
reddevilmidzy Sep 25, 2024
b481656
style: 주석 제거
reddevilmidzy Sep 25, 2024
7c34fd9
Merge pull request #530 from woowacourse-teams/BE/feature/#501-todo_bug
reddevilmidzy Sep 25, 2024
6dbbdc5
Merge branch 'production' into BE/test
koust6u Sep 25, 2024
0db7133
Merge branch 'BE/test' into BE/dev
reddevilmidzy Sep 25, 2024
2961c88
Merge pull request #567 from woowacourse-teams/BE/dev
reddevilmidzy Sep 25, 2024
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
6 changes: 1 addition & 5 deletions .github/workflows/be_cd-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ jobs:

deploy:
environment: test
runs-on: coduo_runner_test-server
runs-on: test-ec2-runner
needs: build
defaults:
run:
Expand All @@ -75,10 +75,6 @@ jobs:
DOCKER_REPO_NAME=${{ secrets.DOCKER_REPO_NAME }}

# DB Configuration secrets info from Github Secrets
MYSQL_DB_NAME=${{ secrets.MYSQL_DB_NAME }}
MYSQL_TIME_ZONE=${{ secrets.MYSQL_TIME_ZONE }}
DB_BINDING_PORT=${{ secrets.DB_BINDING_PORT }}
DOCKER_DATA_PATH=${{ secrets.DOCKER_DATA_PATH }}
DB_URL=${{ secrets.DB_URL }}
DB_USERNAME=${{ secrets.DB_USERNAME }}
DB_PASSWORD=${{ secrets.DB_PASSWORD }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class MemberController implements MemberControllerDocs {
public ResponseEntity<MemberReadResponse> getMember(
@CookieValue(SIGN_IN_COOKIE_NAME) final String token
) {
final MemberReadResponse response = memberService.findMemberByCredential(token);
final MemberReadResponse response = memberService.findMemberNameByCredential(token);

return ResponseEntity.ok(response);
}
Expand Down
1 change: 0 additions & 1 deletion backend/src/main/java/site/coduo/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,3 @@ public int hashCode() {
return Objects.hash(id);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,17 @@ public void createMember(final String username, final String accessToken) {
memberRepository.save(member);
}

public MemberReadResponse findMemberByCredential(final String token) {
public MemberReadResponse findMemberNameByCredential(final String token) {
final String userId = jwtProvider.extractSubject(token);
final Member member = memberRepository.findByUserId(userId)
.orElseThrow(() -> new MemberNotFoundException(String.format("%s는 찾을 수 없는 회원 아이디입니다.", userId)));

return new MemberReadResponse(member.getUsername());
}

public Member findMemberByCredential(final String token) {
final String userId = jwtProvider.extractSubject(token);
return memberRepository.findByUserId(userId)
.orElseThrow(() -> new MemberNotFoundException(String.format("%s는 찾을 수 없는 회원 아이디입니다.", userId)));
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package site.coduo.pairroom.controller;

import static site.coduo.common.config.filter.SignInCookieFilter.SIGN_IN_COOKIE_NAME;

import java.net.URI;
import java.util.List;

import jakarta.validation.Valid;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand All @@ -20,6 +24,7 @@
import site.coduo.pairroom.service.dto.PairRoomReadRequest;
import site.coduo.pairroom.service.dto.PairRoomReadResponse;
import site.coduo.pairroom.service.dto.PairRoomStatusUpdateRequest;
import site.coduo.pairroom.service.dto.PairRoomMemberResponse;

@RequiredArgsConstructor
@RestController
Expand All @@ -29,19 +34,18 @@ public class PairRoomController implements PairRoomDocs {

@PostMapping("/pair-room")
public ResponseEntity<PairRoomCreateResponse> createPairRoom(
@Valid @RequestBody final PairRoomCreateRequest request
@Valid @RequestBody final PairRoomCreateRequest request,
@CookieValue(value = SIGN_IN_COOKIE_NAME, required = false) final String token
) {
final PairRoomCreateResponse response = new PairRoomCreateResponse(
pairRoomService.save(request));
final String accessCode = pairRoomService.savePairRoom(request, token);
final PairRoomCreateResponse response = new PairRoomCreateResponse(accessCode);

return ResponseEntity.created(URI.create("/"))
.body(response);
}

@PatchMapping("/pair-room/{accessCode}/pair-swap")
public ResponseEntity<Void> updatePairRole(
@PathVariable("accessCode") final String accessCode
) {
public ResponseEntity<Void> updatePairRole(@PathVariable("accessCode") final String accessCode) {
pairRoomService.updateNavigatorWithDriver(accessCode);

return ResponseEntity.noContent()
Expand All @@ -67,4 +71,14 @@ public ResponseEntity<PairRoomReadResponse> getPairRoom(

return ResponseEntity.ok(response);
}

@GetMapping("/my-pair-rooms")
public ResponseEntity<List<PairRoomMemberResponse>> getPairRooms(
@CookieValue(SIGN_IN_COOKIE_NAME) final String token
) {
final List<PairRoomMemberResponse> pairRooms = pairRoomService.findPairRooms(token);

return ResponseEntity.ok()
.body(pairRooms);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package site.coduo.pairroom.controller.docs;

import java.util.List;

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
Expand All @@ -14,6 +17,7 @@
import site.coduo.pairroom.service.dto.PairRoomReadRequest;
import site.coduo.pairroom.service.dto.PairRoomReadResponse;
import site.coduo.pairroom.service.dto.PairRoomStatusUpdateRequest;
import site.coduo.pairroom.service.dto.PairRoomMemberResponse;

@Tag(name = "페어룸 API")
public interface PairRoomDocs {
Expand All @@ -31,7 +35,9 @@ ResponseEntity<PairRoomReadResponse> getPairRoom(
schema = @Schema(implementation = PairRoomCreateResponse.class)))
ResponseEntity<PairRoomCreateResponse> createPairRoom(
@Parameter(description = "페어 프로그래밍에 참여하는 드라이버 이름, 내비게이터 이름, 타이머 시간, 타이머 남은 시간", required = true)
PairRoomCreateRequest pairRoomCreateRequest
PairRoomCreateRequest pairRoomCreateRequest,
@Parameter(description = "로그인 유저 토큰")
String token
);

@Operation(summary = "드라이버 내비게이터 역할을 바꾼다.")
Expand All @@ -49,4 +55,17 @@ ResponseEntity<Void> updatePairRoomStatus(
@Parameter(description = "변경할 페어룸 상태", required = true)
PairRoomStatusUpdateRequest request
);

@Operation(summary = "자신의 페어룸을 조회한다.")
@ApiResponse(responseCode = "200", description = "페어룸 조회 성공", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
schema = @Schema(implementation = PairRoomMemberResponse.class)))
ResponseEntity<List<PairRoomMemberResponse>> getPairRooms(
@Parameter(
in = ParameterIn.COOKIE,
name = "coduo_whoami",
description = "사용자가 인증에 성공하면 서버에서 발급하는 쿠키",
schema = @Schema(type = "string"),
required = true
)
String signInToken);
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,15 @@ public boolean equals(final Object o) {
public int hashCode() {
return Objects.hash(id);
}

@Override
public String toString() {
return "PairRoomEntity{" +
"id=" + id +
", status=" + status +
", navigator='" + navigator + '\'' +
", driver='" + driver + '\'' +
", accessCode='" + accessCode + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package site.coduo.pairroom.repository;

import java.util.Objects;

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.Getter;
import lombok.NoArgsConstructor;
import site.coduo.member.domain.Member;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "PAIR_ROOM_MEMBER")
@Entity
public class PairRoomMemberEntity {

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

@ManyToOne
@JoinColumn(name = "PAIR_ROOM_ID")
private PairRoomEntity pairRoom;

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

public PairRoomMemberEntity(final PairRoomEntity pairRoom, final Member member) {
this.pairRoom = pairRoom;
this.member = member;
}

@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (!(o instanceof final PairRoomMemberEntity that)) {
return false;
}
return Objects.equals(getId(), that.getId());
}

@Override
public int hashCode() {
return Objects.hashCode(getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package site.coduo.pairroom.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;

import site.coduo.member.domain.Member;

public interface PairRoomMemberRepository extends JpaRepository<PairRoomMemberEntity, Long> {

List<PairRoomMemberEntity> findByMember(Member member);
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

import java.util.List;

import jakarta.annotation.Nullable;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;
import site.coduo.member.domain.Member;
import site.coduo.member.service.MemberService;
import site.coduo.pairroom.domain.Pair;
import site.coduo.pairroom.domain.PairName;
import site.coduo.pairroom.domain.PairRoom;
Expand All @@ -14,8 +18,11 @@
import site.coduo.pairroom.domain.accesscode.AccessCodeFactory;
import site.coduo.pairroom.domain.accesscode.UUIDAccessCodeStrategy;
import site.coduo.pairroom.repository.PairRoomEntity;
import site.coduo.pairroom.repository.PairRoomMemberEntity;
import site.coduo.pairroom.repository.PairRoomMemberRepository;
import site.coduo.pairroom.repository.PairRoomRepository;
import site.coduo.pairroom.service.dto.PairRoomCreateRequest;
import site.coduo.pairroom.service.dto.PairRoomMemberResponse;
import site.coduo.pairroom.service.dto.PairRoomReadResponse;
import site.coduo.timer.domain.Timer;
import site.coduo.timer.repository.TimerEntity;
Expand All @@ -28,9 +35,25 @@ public class PairRoomService {

private final PairRoomRepository pairRoomRepository;
private final TimerRepository timerRepository;
private final PairRoomMemberRepository pairRoomMemberRepository;
private final MemberService memberService;

@Transactional
public String save(final PairRoomCreateRequest request) {
public String savePairRoom(final PairRoomCreateRequest request, @Nullable final String token) {
final PairRoom pairRoom = createPairRoom(request);
final PairRoomEntity pairRoomEntity = pairRoomRepository.save(PairRoomEntity.from(pairRoom));

final Timer timer = new Timer(pairRoom.getAccessCode(), request.timerDuration(), request.timerRemainingTime());
timerRepository.save(new TimerEntity(timer, pairRoomEntity));

if (token != null) {
final Member member = memberService.findMemberByCredential(token);
pairRoomMemberRepository.save(new PairRoomMemberEntity(pairRoomEntity, member));
}
return pairRoom.getAccessCodeText();
}

private PairRoom createPairRoom(final PairRoomCreateRequest request) {
final PairRoomStatus status = PairRoomStatus.findByName(request.status());
final Pair pair = new Pair(new PairName(request.navigator()), new PairName(request.driver()));
final List<AccessCode> accessCodes = pairRoomRepository.findAll()
Expand All @@ -40,12 +63,7 @@ public String save(final PairRoomCreateRequest request) {
.toList();

final AccessCodeFactory accessCodeFactory = new AccessCodeFactory(new UUIDAccessCodeStrategy());
final PairRoom pairRoom = new PairRoom(status, pair, accessCodeFactory.generate(accessCodes));

final PairRoomEntity pairRoomEntity = pairRoomRepository.save(PairRoomEntity.from(pairRoom));
final Timer timer = new Timer(pairRoom.getAccessCode(), request.timerDuration(), request.timerRemainingTime());
timerRepository.save(new TimerEntity(timer, pairRoomEntity));
return pairRoom.getAccessCodeText();
return new PairRoom(status, pair, accessCodeFactory.generate(accessCodes));
}

@Transactional
Expand All @@ -66,4 +84,15 @@ public PairRoomReadResponse findPairRoomAndTimer(final String accessCode) {
final TimerEntity timerEntity = timerRepository.fetchTimerByPairRoomId(pairRoomEntity.getId());
return PairRoomReadResponse.of(pairRoomEntity.toDomain(), timerEntity.toDomain());
}

public List<PairRoomMemberResponse> findPairRooms(final String token) {
final Member member = memberService.findMemberByCredential(token);

final List<PairRoomMemberEntity> pairRooms = pairRoomMemberRepository.findByMember(member);

return pairRooms.stream()
.map(PairRoomMemberEntity::getPairRoom)
.map(PairRoomMemberResponse::from)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package site.coduo.pairroom.service.dto;

import site.coduo.pairroom.repository.PairRoomEntity;

public record PairRoomMemberResponse(
Long id,
String status,
String navigator,
String driver,
String accessCode
) {

public static PairRoomMemberResponse from(final PairRoomEntity pairRoom) {
return new PairRoomMemberResponse(pairRoom.getId(), pairRoom.getStatus().name(), pairRoom.getNavigator(),
pairRoom.getDriver(), pairRoom.getAccessCode());
}
}

This file was deleted.

Loading
Loading