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] feat: 방 생성/참여/조회 기능 구현 (#2, #3, #4) #11

Merged
merged 6 commits into from
Jul 15, 2024
Merged
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
1 change: 1 addition & 0 deletions backend/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ dependencies {

// Etc
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

// Database
runtimeOnly 'com.h2database:h2'
Expand Down
30 changes: 30 additions & 0 deletions backend/src/main/java/corea/domain/JoinInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package corea.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import static jakarta.persistence.GenerationType.IDENTITY;

@Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class JoinInfo {

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

private long memberId;

private long roomId;

public JoinInfo(final long memberId, final long roomId) {
this(null,memberId,roomId);
}
}
8 changes: 6 additions & 2 deletions backend/src/main/java/corea/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import static jakarta.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;

@Entity
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Member {

Expand All @@ -21,4 +21,8 @@ public class Member {
private Long id;

private String email;

public Member(final String email) {
this(null, email);
}
}
26 changes: 24 additions & 2 deletions backend/src/main/java/corea/domain/Room.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
package corea.domain;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

import static jakarta.persistence.GenerationType.IDENTITY;
import static lombok.AccessLevel.PROTECTED;

@Entity
@AllArgsConstructor
@NoArgsConstructor(access = PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Room {

Expand All @@ -22,12 +25,31 @@ public class Room {

private String title;

private long memberId;

@Column(length = 25000)
private String repositoryLink;

@Column(length = 25000)
private String thumbnailLink;

private int matchingSize;

private String keyword;

private LocalDateTime submissionDeadline;

private LocalDateTime reviewDeadline;

public Room(final String title,
final long memberId,
final String repositoryLink,
final String thumbnailLink,
final int matchingSize,
final String keyword,
final LocalDateTime submissionDeadline,
final LocalDateTime reviewDeadline) {
this(null, title, memberId, repositoryLink, thumbnailLink, matchingSize, keyword, submissionDeadline, reviewDeadline);
}
}

17 changes: 17 additions & 0 deletions backend/src/main/java/corea/dto/JoinInfoResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package corea.dto;

import corea.domain.JoinInfo;

public record JoinInfoResponse(
long id,
long memberId,
long roomId
){
public static JoinInfoResponse from(final JoinInfo joinInfo){
return new JoinInfoResponse(
joinInfo.getId(),
joinInfo.getMemberId(),
joinInfo.getRoomId()
);
}
}
29 changes: 29 additions & 0 deletions backend/src/main/java/corea/dto/RoomCreateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package corea.dto;

import corea.domain.Room;

import java.time.LocalDateTime;

public record RoomCreateRequest(
String title,
long memberId,
String repositoryLink,
String thumbnailLink,
int matchingSize,
String keyword,
LocalDateTime submissionDeadline,
LocalDateTime reviewDeadline
) {

public Room toEntity() {
return new Room(
title,
memberId,
repositoryLink,
thumbnailLink,
matchingSize,
keyword,
submissionDeadline,
reviewDeadline);
}
}
33 changes: 33 additions & 0 deletions backend/src/main/java/corea/dto/RoomResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package corea.dto;

import corea.domain.Room;

import java.time.LocalDateTime;

public record RoomResponse(
long id,
String title,
String memberEmail,
String repositoryLink,
String thumbnailLink,
int matchingSize,
String keyword,
LocalDateTime submissionDeadline,
LocalDateTime reviewDeadline

) {

public static RoomResponse from(final Room room,final String memberEmail) {
return new RoomResponse(
room.getId(),
room.getTitle(),
memberEmail,
room.getRepositoryLink(),
room.getThumbnailLink(),
room.getMatchingSize(),
room.getKeyword(),
room.getSubmissionDeadline(),
room.getReviewDeadline()
);
}
}
6 changes: 6 additions & 0 deletions backend/src/main/java/corea/dto/RoomResponses.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package corea.dto;

import java.util.List;

public record RoomResponses(List<RoomResponse> rooms) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package corea.repository;

import corea.domain.JoinInfo;
import org.springframework.data.jpa.repository.JpaRepository;

public interface JoinInfoRepository extends JpaRepository<JoinInfo, String> {
}
7 changes: 7 additions & 0 deletions backend/src/main/java/corea/repository/MemberRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package corea.repository;

import corea.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, Long> {
}
7 changes: 7 additions & 0 deletions backend/src/main/java/corea/repository/RoomRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package corea.repository;

import corea.domain.Room;
import org.springframework.data.jpa.repository.JpaRepository;

public interface RoomRepository extends JpaRepository<Room, Long> {
}
74 changes: 74 additions & 0 deletions backend/src/main/java/corea/service/RoomService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package corea.service;

import corea.domain.JoinInfo;
import corea.domain.Member;
import corea.domain.Room;
import corea.dto.JoinInfoResponse;
import corea.dto.RoomCreateRequest;
import corea.dto.RoomResponse;
import corea.dto.RoomResponses;
import corea.repository.JoinInfoRepository;
import corea.repository.MemberRepository;
import corea.repository.RoomRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toList;

@Service
@AllArgsConstructor
@Transactional(readOnly = true)
public class RoomService {

private final RoomRepository roomRepository;
private final MemberRepository memberRepository;
private final JoinInfoRepository joinInfoRepository;

public RoomResponse create(final RoomCreateRequest request) {
final Room room = roomRepository.save(request.toEntity());
final long memberId = request.memberId();
final Member member = getMember(memberId);
return RoomResponse.from(room, member.getEmail());
}

public RoomResponse findOne(final long id) {
final Room room = roomRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException(String.format("%d에 해당하는 방이 없습니다.", id)));
final Member member = getMember(room.getMemberId());

return RoomResponse.from(room, member.getEmail());
}

private Member getMember(final long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException(String.format("%d에 해당하는 멤버가 없습니다.", memberId)));
}

public RoomResponses findAll() {
final List<Room> rooms = roomRepository.findAll();
return rooms.stream()
.map(room -> {
final long memberId = room.getMemberId();
final Member member = getMember(memberId);
return RoomResponse.from(room, member.getEmail());
})
.collect(collectingAndThen(toList(), RoomResponses::new));
}

public JoinInfoResponse join(final long roomId, final long memberId) {
final Room room = getRoom(roomId);
final Member member = getMember(memberId);

final JoinInfo joinInfo = new JoinInfo(roomId, memberId);
return JoinInfoResponse.from(joinInfoRepository.save(joinInfo));
}

public Room getRoom(final long roomId) {
return roomRepository.findById(roomId)
.orElseThrow(() -> new IllegalArgumentException(String.format("%d에 해당하는 방이 없습니다.", roomId)));
}
}
1 change: 0 additions & 1 deletion backend/src/main/resources/application.properties

This file was deleted.

17 changes: 17 additions & 0 deletions backend/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
spring:
application:
name: backend
jpa:
defer-datasource-initialization: true
show-sql: true
properties:
hibernate:
format_sql: true
hibernate:
ddl-auto: create-drop
h2:
console:
enabled: true
path: /h2-console
datasource:
url: jdbc:h2:mem:database
13 changes: 13 additions & 0 deletions backend/src/test/java/config/ServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package config;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.jdbc.Sql;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Sql(value = {"/clear.sql"},executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
@Retention(RetentionPolicy.RUNTIME)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
public @interface ServiceTest {
}
Loading
Loading