-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[feat] Room 생성 API
- Loading branch information
Showing
17 changed files
with
339 additions
and
1 deletion.
There are no files selected for viewing
11 changes: 11 additions & 0 deletions
11
src/main/java/com/telepigeon/server/annotation/UserId.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.telepigeon.server.annotation; | ||
|
||
import java.lang.annotation.ElementType; | ||
import java.lang.annotation.Retention; | ||
import java.lang.annotation.RetentionPolicy; | ||
import java.lang.annotation.Target; | ||
|
||
@Target(ElementType.PARAMETER) | ||
@Retention(RetentionPolicy.RUNTIME) | ||
public @interface UserId { | ||
} |
32 changes: 32 additions & 0 deletions
32
src/main/java/com/telepigeon/server/controller/RoomController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package com.telepigeon.server.controller; | ||
|
||
import com.telepigeon.server.annotation.UserId; | ||
import com.telepigeon.server.domain.Room; | ||
import com.telepigeon.server.dto.room.request.RoomCreateDto; | ||
import com.telepigeon.server.service.room.RoomService; | ||
import jakarta.validation.Valid; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestBody; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import java.net.URI; | ||
|
||
@RestController | ||
@RequiredArgsConstructor | ||
@RequestMapping("/api/v1") | ||
public class RoomController { | ||
private final RoomService roomService; | ||
|
||
@PostMapping("/rooms") | ||
public ResponseEntity<Void> createRoom( | ||
@UserId Long userId, | ||
@Valid @RequestBody RoomCreateDto roomCreateDto | ||
) { | ||
Room createdRoom = roomService.createRoom(roomCreateDto); | ||
URI location = URI.create("/rooms/" + createdRoom.getId()); | ||
return ResponseEntity.created(location).build(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 16 additions & 0 deletions
16
src/main/java/com/telepigeon/server/dto/room/request/RoomCreateDto.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
package com.telepigeon.server.dto.room.request; | ||
|
||
import com.telepigeon.server.domain.Room; | ||
import jakarta.annotation.Nullable; | ||
import jakarta.validation.Valid; | ||
import jakarta.validation.constraints.NotNull; | ||
import jakarta.validation.constraints.Size; | ||
|
||
public record RoomCreateDto( | ||
@NotNull @Size(max=8, min=2) | ||
String name | ||
) { | ||
public static RoomCreateDto of(Room room) { | ||
return new RoomCreateDto(String.valueOf(room.getName())); | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
src/main/java/com/telepigeon/server/exception/NotFoundException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.telepigeon.server.exception; | ||
|
||
import com.telepigeon.server.exception.code.NotFoundErrorCode; | ||
import lombok.Getter; | ||
import lombok.RequiredArgsConstructor; | ||
|
||
@Getter | ||
@RequiredArgsConstructor | ||
public class NotFoundException extends RuntimeException{ | ||
private final NotFoundErrorCode errorCode; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
src/main/java/com/telepigeon/server/repository/ProfileRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package com.telepigeon.server.repository; | ||
|
||
import com.telepigeon.server.domain.Profile; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface ProfileRepository extends JpaRepository<Profile, Long> { | ||
} |
9 changes: 9 additions & 0 deletions
9
src/main/java/com/telepigeon/server/repository/RoomRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package com.telepigeon.server.repository; | ||
|
||
import com.telepigeon.server.domain.Room; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface RoomRepository extends JpaRepository<Room, Long> { | ||
boolean existsByName(String name); | ||
boolean existsByCode(String code); | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/java/com/telepigeon/server/repository/UserRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.telepigeon.server.repository; | ||
|
||
import com.telepigeon.server.domain.Users; | ||
import com.telepigeon.server.exception.NotFoundException; | ||
import com.telepigeon.server.exception.code.NotFoundErrorCode; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface UserRepository extends JpaRepository<Users, Long> { | ||
default Users findByIdOrThrow(Long id) { | ||
return findById(id).orElseThrow(() -> new NotFoundException(NotFoundErrorCode.USER_NOT_FOUND)); | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
src/main/java/com/telepigeon/server/service/profile/ProfileSaver.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package com.telepigeon.server.service.profile; | ||
|
||
import com.telepigeon.server.domain.Profile; | ||
import com.telepigeon.server.repository.ProfileRepository; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class ProfileSaver { | ||
|
||
private final ProfileRepository profileRepository; | ||
|
||
public Profile save(Profile profile) { | ||
return profileRepository.save(profile); | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
src/main/java/com/telepigeon/server/service/room/RoomRemover.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package com.telepigeon.server.service.room; | ||
|
||
import com.telepigeon.server.domain.Room; | ||
import com.telepigeon.server.repository.RoomRepository; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class RoomRemover { | ||
|
||
private final RoomRepository roomRepository; | ||
|
||
public void remove(final Room room) { | ||
roomRepository.delete(room); | ||
} | ||
} |
24 changes: 24 additions & 0 deletions
24
src/main/java/com/telepigeon/server/service/room/RoomRetriever.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package com.telepigeon.server.service.room; | ||
|
||
import com.telepigeon.server.domain.Room; | ||
import com.telepigeon.server.exception.NotFoundException; | ||
import com.telepigeon.server.exception.code.NotFoundErrorCode; | ||
import com.telepigeon.server.repository.RoomRepository; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class RoomRetriever { | ||
|
||
private final RoomRepository roomRepository; | ||
|
||
public boolean existsByName(String name) { | ||
return roomRepository.existsByName(name); | ||
} | ||
|
||
public Room findById(final long id) { | ||
return roomRepository.findById(id) | ||
.orElseThrow(() -> new NotFoundException(NotFoundErrorCode.ROOM_NOT_FOUND)); | ||
} | ||
} |
17 changes: 17 additions & 0 deletions
17
src/main/java/com/telepigeon/server/service/room/RoomSaver.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package com.telepigeon.server.service.room; | ||
|
||
import com.telepigeon.server.domain.Room; | ||
import com.telepigeon.server.repository.RoomRepository; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
@RequiredArgsConstructor | ||
public class RoomSaver { | ||
|
||
private final RoomRepository roomRepository; | ||
|
||
public Room save(final Room room) { | ||
return roomRepository.save(room); | ||
} | ||
} |
59 changes: 59 additions & 0 deletions
59
src/main/java/com/telepigeon/server/service/room/RoomService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
package com.telepigeon.server.service.room; | ||
|
||
import com.telepigeon.server.domain.Profile; | ||
import com.telepigeon.server.domain.Room; | ||
import com.telepigeon.server.domain.Users; | ||
import com.telepigeon.server.dto.room.request.RoomCreateDto; | ||
import com.telepigeon.server.repository.RoomRepository; | ||
import com.telepigeon.server.repository.UserRepository; | ||
import com.telepigeon.server.service.profile.ProfileSaver; | ||
import jakarta.transaction.Transactional; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
|
||
import java.util.Random; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class RoomService { | ||
|
||
private final RoomRepository roomRepository; | ||
private final RoomSaver roomSaver; | ||
private final RoomRetriever roomRetriever; | ||
private final RoomRemover roomRemover; | ||
private final UserRepository userRepository; | ||
private final ProfileSaver profileSaver; | ||
|
||
@Transactional | ||
public Room createRoom(final RoomCreateDto roomCreateDto){ | ||
// Users user = userRepository.findByIdOrThrow(userId); | ||
|
||
String code = createCode(); | ||
|
||
Room room = Room.create(roomCreateDto, code); | ||
Room savedRoom = roomSaver.save(room); | ||
|
||
// Profile profile = Profile.create(user, savedRoom); | ||
// Profile savedProfile = profileSaver.save(profile); | ||
|
||
return savedRoom; | ||
} | ||
|
||
private String createCode() { | ||
String characters = "abcdefghijklmnopqrstuvwxyz0123456789"; | ||
Random random = new Random(); | ||
String code; | ||
|
||
do { | ||
StringBuilder codeBuilder = new StringBuilder(); | ||
for (int i = 0; i < 10; i++) { | ||
int index = random.nextInt(characters.length()); | ||
codeBuilder.append(characters.charAt(index)); | ||
} | ||
code = codeBuilder.toString(); | ||
} while (roomRepository.existsByCode(code)); | ||
|
||
|
||
return code; | ||
} | ||
} |
24 changes: 24 additions & 0 deletions
24
src/test/java/com/telepigeon/server/roomTest/RoomDomainTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
package com.telepigeon.server.roomTest; | ||
|
||
import com.telepigeon.server.domain.Room; | ||
import com.telepigeon.server.dto.room.request.RoomCreateDto; | ||
import org.junit.jupiter.api.Assertions; | ||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
|
||
public class RoomDomainTest { | ||
|
||
@Test | ||
@DisplayName("Room 생성") | ||
public void createRoomTest() { | ||
Room room = Room.create(new RoomCreateDto("name"), "code"); | ||
Assertions.assertNotNull(room); | ||
} | ||
|
||
@Test | ||
@DisplayName("Room 생성 확인") | ||
public void checkCreateRoomTest() { | ||
Room room = Room.create(new RoomCreateDto("name"), "code"); | ||
Assertions.assertEquals(room.getName(), "name"); | ||
} | ||
} |
40 changes: 40 additions & 0 deletions
40
src/test/java/com/telepigeon/server/roomTest/RoomServiceTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package com.telepigeon.server.roomTest; | ||
|
||
import com.telepigeon.server.domain.Room; | ||
import com.telepigeon.server.dto.room.request.RoomCreateDto; | ||
import com.telepigeon.server.repository.RoomRepository; | ||
import com.telepigeon.server.service.room.RoomRetriever; | ||
import com.telepigeon.server.service.room.RoomSaver; | ||
import org.junit.jupiter.api.Assertions; | ||
import org.junit.jupiter.api.DisplayName; | ||
import org.junit.jupiter.api.Test; | ||
import org.mockito.Mock; | ||
import org.mockito.Mockito; | ||
|
||
public class RoomServiceTest { | ||
|
||
@Mock | ||
private RoomRepository roomRepository = Mockito.mock(RoomRepository.class); | ||
|
||
@Test | ||
@DisplayName("Room DB에 저장 확인") | ||
public void checkRoomInDB() { | ||
RoomSaver roomSaver = new RoomSaver(roomRepository); | ||
Room room = Room.create(new RoomCreateDto("name"), "code"); | ||
Mockito.doAnswer(invocation -> room).when(roomRepository).save(room); | ||
Room room1 = roomSaver.save(room); | ||
Assertions.assertEquals(room.getName(), room1.getName()); | ||
} | ||
|
||
@Test | ||
@DisplayName("Room DB에서 꺼내오기 확인") | ||
public void checkRoomToDB() { | ||
RoomRetriever roomRetriever = new RoomRetriever(roomRepository); | ||
Room room = Room.create(new RoomCreateDto("name"), "code"); | ||
Mockito.doAnswer(invocation -> true).when(roomRepository).existsByName(room.getName()); | ||
RoomCreateDto roomCreateDto = RoomCreateDto.of(room); | ||
boolean isCheck = roomRetriever.existsByName(roomCreateDto.name()); | ||
Assertions.assertTrue(isCheck); | ||
} | ||
|
||
} |