Skip to content
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
4 changes: 4 additions & 0 deletions docs/error_code.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@

- **COMMENT404: ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค.**

## โœ… **Live Session ์˜ค๋ฅ˜**

- **LIVE_SESSION404: ์กด์žฌํ•˜์ง€ ์•Š๋Š” Live Session id ๊ฐ’์ž…๋‹ˆ๋‹ค.**

---

## โœ… **ํŽ˜์ด์ง• ์˜ค๋ฅ˜**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.woori.codeshare.global.response.ApiResponse;
import com.woori.codeshare.global.response.ResponseCode;
import com.woori.codeshare.room.controller.dto.LiveSessionRequestDTO;
import com.woori.codeshare.room.controller.dto.LiveSessionResponseDTO;
import com.woori.codeshare.room.controller.dto.RoomRequestDTO;
import com.woori.codeshare.room.controller.dto.RoomResponseDTO;
import com.woori.codeshare.room.service.RoomService;
Expand Down Expand Up @@ -54,5 +56,31 @@ public ResponseEntity<ApiResponse<RoomResponseDTO.RoomEnterResponse>> enterRoom(
RoomResponseDTO.RoomEnterResponse responseDTO = roomService.enterRoomByUuid(uuid, password);
return ResponseEntity.ok(ApiResponse.of(ResponseCode.CONFIRM, responseDTO));
}

/**
* ํ˜„์žฌ ์ฝ”๋“œ ์„ธ์…˜ ์ €์žฅ API
*/
@PostMapping("/{roomId}/live-session/save")
@Operation(summary = "ํ˜„์žฌ ์ฝ”๋“œ ์„ธ์…˜ ์ €์žฅ API", description = "ํŠน์ • ๋ฐฉ์˜ ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ๋‚ด์šฉ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.")
public ResponseEntity<ApiResponse<LiveSessionResponseDTO.LiveSessionResponse>> saveLiveSession(
@PathVariable Long roomId,
@RequestBody LiveSessionRequestDTO.LiveSessionRequest request) {

LiveSessionResponseDTO.LiveSessionResponse response = roomService.saveLiveSession(roomId, request);
return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS, response));
}

/**
* ํ˜„์žฌ ์ฝ”๋“œ ์„ธ์…˜ ์กฐํšŒ API
*/
@GetMapping("/{roomId}/live-session")
@Operation(summary = "ํ˜„์žฌ ์ฝ”๋“œ ์„ธ์…˜ ์กฐํšŒ API", description = "ํŠน์ • ๋ฐฉ์˜ ์‹ค์‹œ๊ฐ„ ์ฝ”๋“œ ๋‚ด์šฉ์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.")
public ResponseEntity<ApiResponse<LiveSessionResponseDTO.LiveSessionResponse>> getLiveSession(
@PathVariable Long roomId) {

LiveSessionResponseDTO.LiveSessionResponse response = roomService.getLiveSession(roomId);
return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS, response));
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.woori.codeshare.room.controller.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

public class LiveSessionRequestDTO {

@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class LiveSessionRequest {
private String code;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.woori.codeshare.room.controller.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

public class LiveSessionResponseDTO {

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class LiveSessionResponse {
private Long roomId;
private String code;
private LocalDateTime updatedAt;
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/woori/codeshare/room/domain/LiveSession.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.woori.codeshare.room.domain;

import com.woori.codeshare.global.config.BaseDateTimeEntity;
import jakarta.persistence.*;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@NoArgsConstructor
public class LiveSession extends BaseDateTimeEntity {

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

@OneToOne
@JoinColumn(name = "room_id", nullable = false)
private Room room;

@Lob
private String code;

public LiveSession(Room room) {
this.room = room;
this.code = "";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public enum RoomErrorCode implements BaseErrorCode {

DUPLICATE_ROOM_TITLE(HttpStatus.BAD_REQUEST, "ROOM400", "์ด๋ฏธ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฐฉ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค."),
INVALID_PASSWORD(HttpStatus.FORBIDDEN, "ROOM403", "๋ฐฉ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ž˜๋ชป ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."),
ROOM_NOT_FOUND(HttpStatus.NOT_FOUND, "ROOM404", "์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์ž…๋‹ˆ๋‹ค.");
ROOM_NOT_FOUND(HttpStatus.NOT_FOUND, "ROOM404", "์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์ž…๋‹ˆ๋‹ค."),
LIVE_SESSION_NOT_FOUND(HttpStatus.NOT_FOUND, "LIVE_SESSION404", "์กด์žฌํ•˜์ง€ ์•Š๋Š” Live Session id ๊ฐ’์ž…๋‹ˆ๋‹ค.");

private final HttpStatus status;
private final String code;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.woori.codeshare.room.repository;

import com.woori.codeshare.room.domain.LiveSession;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface LiveSessionRepository extends JpaRepository<LiveSession, Long> {
Optional<LiveSession> findByRoom_RoomId(Long roomId);
}
48 changes: 48 additions & 0 deletions src/main/java/com/woori/codeshare/room/service/RoomService.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package com.woori.codeshare.room.service;


import com.woori.codeshare.room.controller.dto.LiveSessionRequestDTO;
import com.woori.codeshare.room.controller.dto.LiveSessionResponseDTO;
import com.woori.codeshare.room.controller.dto.RoomRequestDTO;
import com.woori.codeshare.room.controller.dto.RoomResponseDTO;
import com.woori.codeshare.room.domain.LiveSession;
import com.woori.codeshare.room.domain.Room;
import com.woori.codeshare.room.exception.RoomErrorCode;
import com.woori.codeshare.room.exception.RoomException;
import com.woori.codeshare.room.repository.LiveSessionRepository;
import com.woori.codeshare.room.repository.RoomRepository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
Expand All @@ -18,6 +23,7 @@
public class RoomService {

private final RoomRepository roomRepository;
private final LiveSessionRepository liveSessionRepository;
private final BCryptPasswordEncoder passwordEncoder;

/**
Expand Down Expand Up @@ -76,5 +82,47 @@ public RoomResponseDTO.RoomEnterResponse enterRoomByUuid(String uuid, String raw
.createdAt(room.getCreatedAt())
.build();
}

/**
* ํ˜„์žฌ ์ฝ”๋“œ ์„ธ์…˜ ์ €์žฅ
*/
@Transactional
public LiveSessionResponseDTO.LiveSessionResponse saveLiveSession(Long roomId, LiveSessionRequestDTO.LiveSessionRequest request) {
Room room = roomRepository.findById(roomId)
.orElseThrow(() -> new RoomException(RoomErrorCode.ROOM_NOT_FOUND));

// ๊ธฐ์กด Live Session์ด ์กด์žฌํ•˜๋ฉด ์—…๋ฐ์ดํŠธ, ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ
LiveSession liveSession = liveSessionRepository.findByRoom_RoomId(roomId)
.orElse(new LiveSession(room));

liveSession.setCode(request.getCode());
liveSessionRepository.save(liveSession);


return LiveSessionResponseDTO.LiveSessionResponse.builder()
.roomId(roomId)
.code(liveSession.getCode())
.updatedAt(liveSession.getUpdatedAt())
.build();
}

/**
* ํ˜„์žฌ ์ฝ”๋“œ ์„ธ์…˜ ์กฐํšŒ
*/
@Transactional()
public LiveSessionResponseDTO.LiveSessionResponse getLiveSession(Long roomId) {
Room room = roomRepository.findById(roomId)
.orElseThrow(() -> new RoomException(RoomErrorCode.ROOM_NOT_FOUND));

LiveSession liveSession = liveSessionRepository.findByRoom_RoomId(roomId)
.orElseThrow(() -> new RoomException(RoomErrorCode.LIVE_SESSION_NOT_FOUND));

return LiveSessionResponseDTO.LiveSessionResponse.builder()
.roomId(roomId)
.code(liveSession.getCode())
.updatedAt(liveSession.getUpdatedAt())
.build();
}

}

Loading