Skip to content

Commit d4e5c0f

Browse files
KUPKUP
authored andcommitted
feat(Room) : Create Room 새엇ㅇ
1 parent a965602 commit d4e5c0f

5 files changed

Lines changed: 101 additions & 9 deletions

File tree

src/main/java/com/love/yourvoiceback/room/controller/RoomController.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.love.yourvoiceback.room.controller;
22

3+
import com.love.yourvoiceback.common.security.CurrentUser;
34
import com.love.yourvoiceback.room.controller.dto.request.RoomCreateRequest;
45
import com.love.yourvoiceback.room.controller.dto.response.RoomResponse;
56
import com.love.yourvoiceback.room.service.RoomService;
7+
import com.love.yourvoiceback.user.User;
68
import jakarta.validation.Valid;
79
import lombok.RequiredArgsConstructor;
810
import org.springframework.http.ResponseEntity;
9-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
10-
import org.springframework.security.core.userdetails.UserDetails;
1111
import org.springframework.web.bind.annotation.PostMapping;
1212
import org.springframework.web.bind.annotation.RequestBody;
1313
import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,8 +23,10 @@ public class RoomController {
2323
@PostMapping("")
2424
public ResponseEntity<RoomResponse> createRoom(
2525
@Valid @RequestBody RoomCreateRequest request,
26-
@AuthenticationPrincipal UserDetails userDetails
27-
) {
26+
@CurrentUser User user
2827

28+
) {
29+
RoomResponse response = roomService.createRoom(request, user);
30+
return ResponseEntity.ok(response);
2931
}
3032
}

src/main/java/com/love/yourvoiceback/room/controller/dto/request/RoomCreateRequest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.love.yourvoiceback.room.controller.dto.request;
22

33
import com.love.yourvoiceback.room.enums.JoinPolicy;
4+
import jakarta.validation.constraints.Min;
45
import jakarta.validation.constraints.NotBlank;
6+
import jakarta.validation.constraints.NotNull;
7+
import jakarta.validation.constraints.Size;
58
import lombok.AllArgsConstructor;
69
import lombok.Builder;
710
import lombok.Data;
@@ -13,9 +16,16 @@
1316
@Builder
1417
public class RoomCreateRequest {
1518
@NotBlank
19+
@Size(max = 100)
1620
private String title;
21+
22+
@NotNull
1723
private JoinPolicy joinPolicy;
24+
25+
@NotNull
26+
@Min(1)
1827
private Long maxParticipants;
28+
1929
private String password;
2030

2131
}
Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,30 @@
11
package com.love.yourvoiceback.room.controller.dto.response;
22

3-
public class RoomResponse {
3+
import com.love.yourvoiceback.room.domain.VoiceRoom;
4+
import com.love.yourvoiceback.room.enums.JoinPolicy;
5+
6+
import java.time.LocalDateTime;
7+
8+
public record RoomResponse(
9+
Long id,
10+
Long ownerId,
11+
String name,
12+
Integer inviteCode,
13+
JoinPolicy joinPolicy,
14+
Long maxParticipants,
15+
LocalDateTime createdAt,
16+
LocalDateTime updatedAt
17+
) {
18+
public static RoomResponse from(VoiceRoom voiceRoom) {
19+
return new RoomResponse(
20+
voiceRoom.getId(),
21+
voiceRoom.getOwner().getId(),
22+
voiceRoom.getName(),
23+
voiceRoom.getInviteCode(),
24+
voiceRoom.getJoinPolicy(),
25+
voiceRoom.getMaxParticipants(),
26+
voiceRoom.getCreatedAt(),
27+
voiceRoom.getUpdatedAt()
28+
);
29+
}
430
}

src/main/java/com/love/yourvoiceback/room/domain/VoiceRoom.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public class VoiceRoom {
3131
@Column(nullable = false, length = 100)
3232
private String name;
3333

34-
@Column(nullable = false, length = 50, unique = true)
35-
private String inviteCode;
34+
@Column(nullable = false)
35+
private Integer inviteCode;
3636

3737
@Column(length = 255)
3838
private String passwordHash;
@@ -52,7 +52,7 @@ public class VoiceRoom {
5252
@Column(nullable = false)
5353
private LocalDateTime updatedAt = LocalDateTime.now();
5454

55-
public static VoiceRoom of(User owner, String name, String inviteCode, JoinPolicy joinPolicy, String passwordHash, Long maxParticipants) {
55+
public static VoiceRoom of(User owner, String name, Integer inviteCode, JoinPolicy joinPolicy, String passwordHash, Long maxParticipants) {
5656
return VoiceRoom.builder()
5757
.owner(owner)
5858
.name(name)
Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,67 @@
11
package com.love.yourvoiceback.room.service;
22

3+
import com.love.yourvoiceback.common.exception.ApiException;
4+
import com.love.yourvoiceback.common.exception.ErrorCode;
5+
import com.love.yourvoiceback.room.controller.dto.request.RoomCreateRequest;
6+
import com.love.yourvoiceback.room.controller.dto.response.RoomResponse;
7+
import com.love.yourvoiceback.room.domain.VoiceRoom;
8+
import com.love.yourvoiceback.room.enums.JoinPolicy;
39
import com.love.yourvoiceback.room.reopository.RoomRepository;
10+
import com.love.yourvoiceback.user.User;
11+
import jakarta.transaction.Transactional;
412
import lombok.RequiredArgsConstructor;
13+
import org.springframework.security.crypto.password.PasswordEncoder;
514
import org.springframework.stereotype.Service;
615

16+
import java.security.SecureRandom;
17+
718
@Service
819
@RequiredArgsConstructor
920
public class RoomService {
21+
private static final SecureRandom RANDOM = new SecureRandom();
22+
23+
private final RoomRepository roomRepository;
24+
private final PasswordEncoder passwordEncoder;
25+
26+
@Transactional
27+
public RoomResponse createRoom(RoomCreateRequest request, User user) {
28+
validateCreateRoomRequest(request);
29+
30+
VoiceRoom voiceRoom = VoiceRoom.of(
31+
user,
32+
request.getTitle().trim(),
33+
generateInviteCode(),
34+
request.getJoinPolicy(),
35+
resolvePasswordHash(request),
36+
request.getMaxParticipants()
37+
);
38+
VoiceRoom savedVoiceRoom = roomRepository.save(voiceRoom);
39+
return RoomResponse.from(savedVoiceRoom);
40+
}
41+
42+
//비지니스 요구상 사용자가 비밀번호를 누를경우 초대 코드 + 비밀번호 저장 느낌이라 생각
43+
private void validateCreateRoomRequest(RoomCreateRequest request) {
44+
if (request.getJoinPolicy() == JoinPolicy.INVITE_CODE_WITH_PASSWORD
45+
&& (request.getPassword() == null || request.getPassword().isBlank())) {
46+
throw ApiException.error(ErrorCode.INVALID_REQUEST, "Password is required for password-protected rooms");
47+
}
48+
49+
if (request.getJoinPolicy() == JoinPolicy.INVITE_CODE_ONLY
50+
&& request.getPassword() != null
51+
&& !request.getPassword().isBlank()) {
52+
throw ApiException.error(ErrorCode.INVALID_REQUEST, "Password is only allowed for password-protected rooms");
53+
}
54+
}
55+
56+
private String resolvePasswordHash(RoomCreateRequest request) {
57+
if (request.getJoinPolicy() == JoinPolicy.INVITE_CODE_ONLY) {
58+
return null;
59+
}
1060

11-
private RoomRepository roomRepository;
61+
return passwordEncoder.encode(request.getPassword());
62+
}
1263

64+
private Integer generateInviteCode() {
65+
return 100000 + RANDOM.nextInt(900000);
66+
}
1367
}

0 commit comments

Comments
 (0)