Skip to content

Commit 6a46839

Browse files
committed
feat: 추가 요구사항 기능 구현
1 parent f809a24 commit 6a46839

File tree

11 files changed

+65
-10
lines changed

11 files changed

+65
-10
lines changed

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/application/service/channel/JCFChannelService.java

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.sprint.mission.discodeit.domain.channel.Channel;
1313
import com.sprint.mission.discodeit.domain.channel.enums.ChannelType;
1414
import com.sprint.mission.discodeit.domain.channel.enums.ChannelVisibility;
15+
import com.sprint.mission.discodeit.domain.channel.exception.AlreadyJoinUserException;
1516
import com.sprint.mission.discodeit.domain.channel.exception.ChannelNotFoundException;
1617
import com.sprint.mission.discodeit.domain.readStatus.ReadStatus;
1718
import com.sprint.mission.discodeit.domain.user.User;
@@ -73,6 +74,7 @@ public void joinPublicChannel(UUID invitedUserId, InviteChannelRequestDto reques
7374
public void joinPrivateChannel(UUID invitedUserId, InviteChannelRequestDto requestDto) {
7475
User foundUser = userService.findOneByIdOrThrow(invitedUserId);
7576
Channel foundChannel = findOneByIdOrThrow(requestDto.channelId());
77+
throwIsAlreadyJoinUser(foundUser, foundChannel);
7678
foundChannel.join(foundUser);
7779
ReadStatus readStatus = new ReadStatus(foundUser, foundChannel);
7880
readStatusRepository.save(readStatus);
@@ -139,4 +141,10 @@ private FoundChannelResponseDto toFoundChannelResponseDto(Channel foundChannel)
139141
return FoundChannelResponseDto.ofPrivateChannel(foundChannel, lastMessageTime);
140142
}
141143
}
144+
145+
private void throwIsAlreadyJoinUser(User targetUser, Channel targetChannel) {
146+
if (channelRepository.isExistUser(targetUser, targetChannel)) {
147+
throw new AlreadyJoinUserException(ErrorCode.ALREADY_CHANNEL_JOIN_USER, targetUser.getNicknameValue());
148+
}
149+
}
142150
}

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/application/service/userstatus/UserStatusService.java

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ public UserStatusService(
1818
}
1919

2020
public UserStatus createAtFirstJoin(User user) {
21+
if (userStatusRepository.isExistUser(user)) {
22+
throw new IllegalArgumentException("userStatus already exist");
23+
}
2124
return userStatusRepository.save(new UserStatus(user));
2225
}
2326

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.sprint.mission.discodeit.domain.channel.exception;
2+
3+
import com.sprint.mission.discodeit.global.error.ErrorCode;
4+
import com.sprint.mission.discodeit.global.error.exception.InvalidException;
5+
6+
public class AlreadyJoinUserException extends InvalidException {
7+
8+
public AlreadyJoinUserException(ErrorCode errorCode, String message) {
9+
super(errorCode, message);
10+
}
11+
}

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/global/error/ErrorCode.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public enum ErrorCode {
2929

3030
// Channel
3131
INVALID_CHANNEL_NAME_NOT_NULL(400, "채널 이름은 필수 입력값 입니다."),
32-
32+
ALREADY_CHANNEL_JOIN_USER(400, "이미 참여한 채널입니다."),
3333
// Message
3434
INVALID_MESSAGE_CONTENT_NOT_NULL(400, "메시지 내용은 필수 입력값 입니다."),
3535
;

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/channel/FileChannelRepository.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sprint.mission.discodeit.repository.channel;
22

33
import com.sprint.mission.discodeit.domain.channel.Channel;
4+
import com.sprint.mission.discodeit.domain.user.User;
45
import com.sprint.mission.discodeit.repository.channel.interfaces.ChannelRepository;
56
import java.util.List;
67
import java.util.Optional;
@@ -26,4 +27,9 @@ public List<Channel> findAllByUserId(UUID userId) {
2627
public void deleteById(UUID uuid) {
2728

2829
}
30+
31+
@Override
32+
public boolean isExistUser(User user, Channel channel) {
33+
return false;
34+
}
2935
}
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
package com.sprint.mission.discodeit.repository.channel;
22

33
import com.sprint.mission.discodeit.domain.channel.Channel;
4+
import com.sprint.mission.discodeit.domain.user.User;
45
import com.sprint.mission.discodeit.repository.channel.interfaces.ChannelRepository;
56
import java.util.HashMap;
67
import java.util.List;
78
import java.util.Map;
89
import java.util.Optional;
10+
import java.util.Set;
911
import java.util.UUID;
1012

1113
public class InMemoryChannelRepository implements ChannelRepository {
1214

13-
private final Map<UUID, Channel> uuidChannels = new HashMap<>();
15+
private final Map<UUID, Channel> channelUUIDStore = new HashMap<>();
1416

1517
@Override
1618
public Channel save(Channel channel) {
17-
Channel savedChannel = uuidChannels.put(channel.getId(), channel);
19+
Channel savedChannel = channelUUIDStore.put(channel.getId(), channel);
1820
return channel;
1921
}
2022

2123
@Override
2224
public Optional<Channel> findOneById(UUID uuid) {
23-
return Optional.ofNullable(uuidChannels.get(uuid));
25+
return Optional.ofNullable(channelUUIDStore.get(uuid));
2426
}
2527

2628
@Override
@@ -30,6 +32,12 @@ public List<Channel> findAllByUserId(UUID userId) {
3032

3133
@Override
3234
public void deleteById(UUID uuid) {
33-
uuidChannels.remove(uuid);
35+
channelUUIDStore.remove(uuid);
36+
}
37+
38+
@Override
39+
public boolean isExistUser(User user, Channel channel) {
40+
Set<UUID> participantUserId = channelUUIDStore.get(channel.getId()).getParticipantUserId();
41+
return participantUserId.contains(user.getId());
3442
}
3543
}

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/channel/interfaces/ChannelRepository.java

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.sprint.mission.discodeit.repository.channel.interfaces;
22

33
import com.sprint.mission.discodeit.domain.channel.Channel;
4+
import com.sprint.mission.discodeit.domain.user.User;
45
import java.util.List;
56
import java.util.Optional;
67
import java.util.UUID;
@@ -14,4 +15,6 @@ public interface ChannelRepository {
1415
List<Channel> findAllByUserId(UUID userId);
1516

1617
void deleteById(UUID uuid);
18+
19+
boolean isExistUser(User user, Channel channel);
1720
}

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/readstatus/ReadStatusInMemoryRepository.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@
1212

1313
public class ReadStatusInMemoryRepository implements ReadStatusRepository {
1414

15-
private final Map<ReadStatusKey, ReadStatus> readStatusMap = new HashMap<>();
15+
private final Map<ReadStatusKey, ReadStatus> readStatusStore = new HashMap<>();
1616

1717
@Override
1818
public ReadStatus save(ReadStatus readStatus) {
1919
ReadStatusKey readStatusKey = ReadStatusKey.of(readStatus.getUser(), readStatus.getChannel());
20-
readStatusMap.put(readStatusKey, readStatus);
20+
readStatusStore.put(readStatusKey, readStatus);
2121
return readStatus;
2222
}
2323

2424
@Override
2525
public Optional<ReadStatus> findOneByUserIdAndChannelId(User user, Channel channel) {
2626
ReadStatusKey readStatusKey = ReadStatusKey.of(user, channel);
27-
return Optional.ofNullable(readStatusMap.get(readStatusKey));
27+
return Optional.ofNullable(readStatusStore.get(readStatusKey));
2828
}
2929

3030
@Override
3131
public void deleteByChannel(Channel channel) {
3232
channel.getParticipantUserId().stream()
3333
.map(userId -> new ReadStatusKey(userId, channel.getId()))
34-
.forEach(readStatusMap::remove);
34+
.forEach(readStatusStore::remove);
3535
}
3636

3737
private static class ReadStatusKey {

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/user/InMemoryUserRepository.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public Optional<User> findOneByEmail(Email email) {
3838

3939
@Override
4040
public List<User> findAll() {
41-
return uuidUsers.values().stream().toList();
41+
return List.copyOf(uuidUsers.values());
4242
}
4343

4444
@Override

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/userstatus/UserStatusInMemoryRepository.java

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.sprint.mission.discodeit.domain.userstatus.UserStatus;
55
import com.sprint.mission.discodeit.repository.userstatus.interfaces.UserStatusRepository;
66
import java.util.HashMap;
7+
import java.util.List;
78
import java.util.Map;
89
import java.util.Optional;
910
import org.springframework.stereotype.Repository;
@@ -25,8 +26,18 @@ public Optional<UserStatus> findByUser(User user) {
2526
return Optional.ofNullable(userStatuses.get(user));
2627
}
2728

29+
@Override
30+
public List<UserStatus> findAll() {
31+
return List.copyOf(userStatuses.values());
32+
}
33+
2834
@Override
2935
public void deleteByUser(User user) {
3036
userStatuses.remove(user);
3137
}
38+
39+
@Override
40+
public boolean isExistUser(User user) {
41+
return userStatuses.containsKey(user);
42+
}
3243
}

codeit-bootcamp-spring/1-sprint-mission/src/main/java/com/sprint/mission/discodeit/repository/userstatus/interfaces/UserStatusRepository.java

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.sprint.mission.discodeit.domain.user.User;
44
import com.sprint.mission.discodeit.domain.userstatus.UserStatus;
5+
import java.util.List;
56
import java.util.Optional;
67

78
public interface UserStatusRepository {
@@ -10,5 +11,9 @@ public interface UserStatusRepository {
1011

1112
Optional<UserStatus> findByUser(User user);
1213

14+
List<UserStatus> findAll();
15+
1316
void deleteByUser(User user);
17+
18+
boolean isExistUser(User user);
1419
}

0 commit comments

Comments
 (0)