Skip to content

Commit bdf8788

Browse files
Merge pull request #176 from prgrms-web-devcourse-final-project/develop
chore: develop → main 브랜치 머지
2 parents b0bffa6 + 361bd92 commit bdf8788

File tree

47 files changed

+1055
-213
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1055
-213
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ dependencies {
9191

9292
// WebSocket + STOMP 통신용
9393
implementation 'org.springframework.boot:spring-boot-starter-websocket'
94+
95+
// 이메일 전송 의존성
96+
implementation 'org.springframework.boot:spring-boot-starter-mail'
9497
}
9598

9699
tasks.named('test') {

src/main/java/grep/neogul_coder/domain/admin/controller/dto/response/AdminStudyResponse.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class AdminStudyResponse {
2222
private Category category;
2323

2424
@Schema(description = "스터디 종료 여부", example = "false")
25-
private boolean isFinished;
25+
private boolean finished;
2626

2727
@Schema(description = "활성화 여부", example = "true")
2828
private boolean activated;
@@ -33,7 +33,7 @@ private AdminStudyResponse(Long id, String name, Category category, boolean isFi
3333
this.id = id;
3434
this.name = name;
3535
this.category = category;
36-
this.isFinished = isFinished;
36+
this.finished = isFinished;
3737
this.activated = activated;
3838
}
3939

@@ -42,7 +42,7 @@ public static AdminStudyResponse from(Study study) {
4242
.id(study.getId())
4343
.name(study.getName())
4444
.category(study.getCategory())
45-
.isFinished(study.getEndDate().toLocalDate().isBefore(LocalDate.now()))
45+
.isFinished(study.isFinished())
4646
.activated(study.getActivated())
4747
.build();
4848
}
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package grep.neogul_coder.domain.groupchat.controller.dto.requset;
22

3+
import grep.neogul_coder.domain.groupchat.entity.GroupChatMessage;
4+
import grep.neogul_coder.domain.groupchat.entity.GroupChatRoom;
35
import io.swagger.v3.oas.annotations.Hidden;
6+
import java.time.LocalDateTime;
47
import lombok.Getter;
58

69
@Hidden
@@ -18,15 +21,12 @@ public GroupChatMessageRequestDto(Long roomId, Long senderId, String message) {
1821
this.message = message;
1922
}
2023

21-
public void setRoomId(Long roomId) {
22-
this.roomId = roomId;
23-
}
24-
25-
public void setSenderId(Long senderId) {
26-
this.senderId = senderId;
27-
}
28-
29-
public void setMessage(String message) {
30-
this.message = message;
24+
public GroupChatMessage toEntity(GroupChatRoom room, Long senderId) {
25+
return new GroupChatMessage(
26+
room,
27+
senderId,
28+
this.message,
29+
LocalDateTime.now()
30+
);
3131
}
3232
}

src/main/java/grep/neogul_coder/domain/groupchat/controller/dto/requset/GroupChatSwaggerRequest.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,4 @@ public class GroupChatSwaggerRequest {
1515

1616
@Schema(description = "보낼 메시지", example = "안녕하세요!")
1717
private String message;
18-
19-
20-
public void setSenderId(Long senderId) { this.senderId = senderId; }
21-
22-
public void setRoomId(Long roomId) { this.roomId = roomId; }
23-
24-
public void setMessage(String message) { this.message = message; }
2518
}
Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package grep.neogul_coder.domain.groupchat.controller.dto.response;
22

3+
import grep.neogul_coder.domain.groupchat.entity.GroupChatMessage;
4+
import grep.neogul_coder.domain.users.entity.User;
35
import io.swagger.v3.oas.annotations.Hidden;
46
import java.time.LocalDateTime;
57
import lombok.Getter;
@@ -16,10 +18,7 @@ public class GroupChatMessageResponseDto {
1618
private String message; // 메시지 내용
1719
private LocalDateTime sentAt; // 보낸 시간
1820

19-
public GroupChatMessageResponseDto() {
20-
}
21-
22-
public GroupChatMessageResponseDto(Long id, Long roomId, Long senderId,
21+
private GroupChatMessageResponseDto(Long id, Long roomId, Long senderId,
2322
String senderNickname, String profileImageUrl,
2423
String message, LocalDateTime sentAt) {
2524
this.id = id;
@@ -31,31 +30,15 @@ public GroupChatMessageResponseDto(Long id, Long roomId, Long senderId,
3130
this.sentAt = sentAt;
3231
}
3332

34-
public void setId(Long id) {
35-
this.id = id;
36-
}
37-
38-
public void setRoomId(Long roomId) {
39-
this.roomId = roomId;
40-
}
41-
42-
public void setSenderId(Long senderId) {
43-
this.senderId = senderId;
44-
}
45-
46-
public void setSenderNickname(String senderNickname) {
47-
this.senderNickname = senderNickname;
48-
}
49-
50-
public void setProfileImageUrl(String profileImageUrl) {
51-
this.profileImageUrl = profileImageUrl;
52-
}
53-
54-
public void setMessage(String message) {
55-
this.message = message;
56-
}
57-
58-
public void setSentAt(LocalDateTime sentAt) {
59-
this.sentAt = sentAt;
33+
public static GroupChatMessageResponseDto from(GroupChatMessage message, User sender) {
34+
return new GroupChatMessageResponseDto(
35+
message.getMessageId(),
36+
message.getGroupChatRoom().getRoomId(),
37+
sender.getId(),
38+
sender.getNickname(),
39+
sender.getProfileImageUrl(),
40+
message.getMessage(),
41+
message.getSentAt()
42+
);
6043
}
6144
}

src/main/java/grep/neogul_coder/domain/groupchat/entity/GroupChatMessage.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,14 @@ public class GroupChatMessage extends BaseEntity {
2727

2828
private LocalDateTime sentAt;
2929

30-
public void setMessageId(Long messageId) {
31-
this.messageId = messageId;
32-
}
33-
34-
public void setGroupChatRoom(GroupChatRoom groupChatRoom) {
35-
this.groupChatRoom = groupChatRoom;
36-
}
37-
38-
public void setUserId(Long userId) {
30+
public GroupChatMessage(GroupChatRoom room, Long userId, String message, LocalDateTime sentAt) {
31+
this.groupChatRoom = room;
3932
this.userId = userId;
40-
}
41-
42-
public void setMessage(String message) {
4333
this.message = message;
34+
this.sentAt = sentAt;
4435
}
4536

46-
public void setSentAt(LocalDateTime sentAt) {
47-
this.sentAt = sentAt;
37+
protected GroupChatMessage() {
38+
4839
}
4940
}

src/main/java/grep/neogul_coder/domain/groupchat/repository/GroupChatMessageRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99

1010
public interface GroupChatMessageRepository extends JpaRepository<GroupChatMessage, Long> {
1111

12-
1312
// 채팅방(roomId)에 속한 메시지를 전송 시간 내림차순으로 페이징 조회
1413
@Query("SELECT m FROM GroupChatMessage m " +
1514
"WHERE m.groupChatRoom.roomId = :roomId " +
1615
"ORDER BY m.sentAt ASC")
1716
Page<GroupChatMessage> findMessagesByRoomIdAsc(@Param("roomId") Long roomId, Pageable pageable);
1817

19-
}
18+
}

src/main/java/grep/neogul_coder/domain/groupchat/service/GroupChatService.java

Lines changed: 7 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010
import grep.neogul_coder.domain.users.entity.User;
1111
import grep.neogul_coder.domain.users.repository.UserRepository;
1212
import grep.neogul_coder.global.response.PageResponse;
13+
import lombok.RequiredArgsConstructor;
1314
import org.springframework.data.domain.Page;
1415
import org.springframework.data.domain.PageRequest;
1516
import org.springframework.data.domain.Pageable;
1617
import org.springframework.data.domain.Sort;
1718
import org.springframework.stereotype.Service;
1819
import java.time.LocalDateTime;
1920

21+
@RequiredArgsConstructor
2022
@Service
2123
public class GroupChatService {
2224

@@ -25,17 +27,6 @@ public class GroupChatService {
2527
private final UserRepository userRepository;
2628
private final StudyMemberRepository studyMemberRepository;
2729

28-
// 생성자 주입을 통한 의존성 주입
29-
public GroupChatService(GroupChatMessageRepository messageRepository,
30-
GroupChatRoomRepository roomRepository,
31-
UserRepository userRepository,
32-
StudyMemberRepository studyMemberRepository) {
33-
this.messageRepository = messageRepository;
34-
this.roomRepository = roomRepository;
35-
this.userRepository = userRepository;
36-
this.studyMemberRepository = studyMemberRepository;
37-
}
38-
3930
public GroupChatMessageResponseDto saveMessage(GroupChatMessageRequestDto requestDto) {
4031
// 채팅방 존재 여부 확인
4132
GroupChatRoom room = roomRepository.findById(requestDto.getRoomId())
@@ -51,26 +42,14 @@ public GroupChatMessageResponseDto saveMessage(GroupChatMessageRequestDto reques
5142
throw new IllegalArgumentException("해당 스터디에 참가한 사용자만 채팅할 수 있습니다.");
5243
}
5344

54-
// 메시지 생성 및 저장
55-
GroupChatMessage message = new GroupChatMessage();
56-
message.setGroupChatRoom(room); // 엔티티에 있는 필드명 맞게 사용
57-
message.setUserId(sender.getId()); // 연관관계 없이 userId만 저장
58-
message.setMessage(requestDto.getMessage());
59-
message.setSentAt(LocalDateTime.now());
45+
// 메시지 생성
46+
GroupChatMessage message = requestDto.toEntity(room, sender.getId());
6047

6148
// 메시지 저장
6249
messageRepository.save(message);
6350

64-
// 저장된 메시지를 dto로 변환
65-
return new GroupChatMessageResponseDto(
66-
message.getMessageId(),
67-
message.getGroupChatRoom().getRoomId(), // ← roomId 필드가 필요하면 여기서 꺼내야 함
68-
sender.getId(),
69-
sender.getNickname(),
70-
sender.getProfileImageUrl(),
71-
message.getMessage(),
72-
message.getSentAt()
73-
);
51+
// 응답 dto 생성
52+
return GroupChatMessageResponseDto.from(message, sender);
7453
}
7554

7655
// 과거 채팅 메시지 페이징 조회 (무한 스크롤용)
@@ -86,15 +65,7 @@ public PageResponse<GroupChatMessageResponseDto> getMessages(Long roomId, int pa
8665
User sender = userRepository.findById(message.getUserId())
8766
.orElseThrow(() -> new IllegalArgumentException("사용자가 존재하지 않습니다."));
8867

89-
return new GroupChatMessageResponseDto(
90-
message.getMessageId(),
91-
message.getGroupChatRoom().getRoomId(),
92-
sender.getId(),
93-
sender.getNickname(),
94-
sender.getProfileImageUrl(),
95-
message.getMessage(),
96-
message.getSentAt()
97-
);
68+
return GroupChatMessageResponseDto.from(message, sender);
9869
});
9970

10071
// PageResponse로 감싸서 반환

src/main/java/grep/neogul_coder/domain/recruitment/post/service/RecruitmentPostService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import grep.neogul_coder.domain.study.Study;
1616
import grep.neogul_coder.domain.study.repository.StudyRepository;
1717
import grep.neogul_coder.domain.studyapplication.StudyApplication;
18-
import grep.neogul_coder.domain.studyapplication.repository.StudyApplicationRepository;
18+
import grep.neogul_coder.domain.studyapplication.repository.ApplicationRepository;
1919
import grep.neogul_coder.global.exception.business.BusinessException;
2020
import grep.neogul_coder.global.exception.business.NotFoundException;
2121
import lombok.RequiredArgsConstructor;
@@ -40,7 +40,7 @@ public class RecruitmentPostService {
4040
private final RecruitmentPostRepository postRepository;
4141
private final RecruitmentPostQueryRepository postQueryRepository;
4242

43-
private final StudyApplicationRepository studyApplicationRepository;
43+
private final ApplicationRepository applicationRepository;
4444
private final RecruitmentPostCommentQueryRepository commentQueryRepository;
4545

4646
public RecruitmentPostInfo get(long recruitmentPostId) {
@@ -49,7 +49,7 @@ public RecruitmentPostInfo get(long recruitmentPostId) {
4949

5050
RecruitmentPostWithStudyInfo postInfo = postQueryRepository.findPostWithStudyInfo(post.getId());
5151
List<CommentsWithWriterInfo> comments = findCommentsWithWriterInfo(post);
52-
List<StudyApplication> applications = studyApplicationRepository.findByRecruitmentPostId(post.getId());
52+
List<StudyApplication> applications = applicationRepository.findByRecruitmentPostId(post.getId());
5353

5454
return new RecruitmentPostInfo(postInfo, comments, applications.size());
5555
}

src/main/java/grep/neogul_coder/domain/study/Study.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class Study extends BaseEntity {
4343

4444
private boolean extended;
4545

46+
private boolean finished;
47+
4648
protected Study() {}
4749

4850
@Builder
@@ -60,6 +62,7 @@ private Study(Long originStudyId, String name, Category category, int capacity,
6062
this.introduction = introduction;
6163
this.imageUrl = imageUrl;
6264
this.extended = false;
65+
this.finished = false;
6366
}
6467

6568
public void update(String name, Category category, int capacity, StudyType studyType,
@@ -86,6 +89,10 @@ public long calculateRemainSlots(long currentCount) {
8689
return this.capacity - currentCount;
8790
}
8891

92+
public void increaseMemberCount() {
93+
currentCount++;
94+
}
95+
8996
public void decreaseMemberCount() {
9097
currentCount--;
9198
}
@@ -97,4 +104,8 @@ public boolean alreadyExtended() {
97104
public void extend() {
98105
this.extended = true;
99106
}
107+
108+
public void finish() {
109+
this.finished = true;
110+
}
100111
}

0 commit comments

Comments
 (0)