Skip to content

Commit

Permalink
Merge pull request #40 from DayoookE/feat/#39
Browse files Browse the repository at this point in the history
Feat/#39: 구글 미트 api 연동
  • Loading branch information
Gyuhyeok99 authored Dec 12, 2024
2 parents 5fbad1c + 9240530 commit f1f2c9d
Show file tree
Hide file tree
Showing 10 changed files with 104 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public enum ErrorStatus implements BaseErrorCode {
INVALID_LESSON_STATUS(HttpStatus.BAD_REQUEST, "LESSON4006", "유효하지 않은 강의 상태입니다."),
LESSON_NOT_STARTED(HttpStatus.BAD_REQUEST, "LESSON4007", "수업이 시작되지 않았습니다."),
LESSON_ALREADY_STARTED(HttpStatus.BAD_REQUEST, "LESSON4009", "이미 시작된 강의입니다."),
MEETING_ROOM_CREATION_FAILED(HttpStatus.BAD_REQUEST, "LESSON4010", "회의실 생성에 실패하였습니다."),

EMPTY_JWT(HttpStatus.UNAUTHORIZED, "JWT4000", "JWT를 입력해주세요"),
INVALID_JWT(HttpStatus.UNAUTHORIZED, "JWT4001", "유효하지 않은 JWT입니다."),
Expand Down
14 changes: 14 additions & 0 deletions src/main/java/inha/dayoook_e/common/config/RestTemplateConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package inha.dayoook_e.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2 changes: 1 addition & 1 deletion src/main/java/inha/dayoook_e/common/config/WebConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("http://localhost:3000", "http://dayoook2-e-s3.s3-website.ap-northeast-2.amazonaws.com/")
.allowedOriginPatterns("http://localhost:3000", "http://dayoook2-e-s3.s3-website.ap-northeast-2.amazonaws.com/", "http://165.246.44.76:6262")
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH")
.allowedHeaders("*")
.allowCredentials(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,12 @@ public class LessonController {
@Operation(summary = "강의 일정 생성 API", description = "튜터가 강의 일정을 생성합니다.")
public BaseResponse<LessonScheduleResponse> createLessonSchedule(
@AuthenticationPrincipal User user,
@RequestHeader(value = "Authorization") String authToken, // 헤더에서 토큰 추출
@Validated @RequestBody CreateLessonScheduleRequest createLessonScheduleRequest) {

log.info("강의 일정 생성 요청: {} {}", user.getName(), createLessonScheduleRequest);
return BaseResponse.of(LESSON_SCHEDULE_CREATE_OK, lessonService.createLessonSchedule(user, createLessonScheduleRequest));
return BaseResponse.of(LESSON_SCHEDULE_CREATE_OK,
lessonService.createLessonSchedule(user, authToken, createLessonScheduleRequest));
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package inha.dayoook_e.lesson.api.controller.dto.request;

import jakarta.validation.constraints.NotNull;

public record MeetingRequest(

@NotNull
String tutor_email,

@NotNull
String tutee_email
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package inha.dayoook_e.lesson.api.controller.dto.response;

public record MeetingResponse(
String meeting_uri,
String created_at,
String status,
String event_id
) { }
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import inha.dayoook_e.application.domain.Application;
import inha.dayoook_e.application.domain.ApplicationGroup;
import inha.dayoook_e.lesson.api.controller.dto.request.CreateLessonRequest;
import inha.dayoook_e.lesson.api.controller.dto.request.MeetingRequest;
import inha.dayoook_e.lesson.api.controller.dto.response.LessonResponse;
import inha.dayoook_e.lesson.api.controller.dto.response.LessonScheduleResponse;
import inha.dayoook_e.lesson.domain.Lesson;
Expand Down Expand Up @@ -67,4 +68,5 @@ public interface LessonMapper {
@Mapping(target = "roomUrl", source = "meetingRoom.roomUrl")
LessonScheduleResponse toLessonScheduleResponse(LessonSchedule schedule, MeetingRoom meetingRoom);

MeetingRequest toMeetingRequest(String tutor_email, String tutee_email);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
public interface LessonService {

LessonResponse createLesson(CreateLessonRequest createLessonRequest);
LessonScheduleResponse createLessonSchedule(User user, CreateLessonScheduleRequest createLessonScheduleRequest);
LessonScheduleResponse createLessonSchedule(User user, String accessToken, CreateLessonScheduleRequest createLessonScheduleRequest);

LessonScheduleResponse completeLessonSchedule(User user, Integer scheduleId, CompleteLessonRequest completeLessonRequest);
LessonScheduleResponse cancelLessonSchedule(User user, Integer scheduleId, CancelLessonRequest cancelLessonRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,32 @@
import inha.dayoook_e.application.domain.ApplicationGroup;
import inha.dayoook_e.application.domain.repository.ApplicationGroupJpaRepository;
import inha.dayoook_e.common.exceptions.BaseException;
import inha.dayoook_e.lesson.api.controller.dto.request.CancelLessonRequest;
import inha.dayoook_e.lesson.api.controller.dto.request.CompleteLessonRequest;
import inha.dayoook_e.lesson.api.controller.dto.request.CreateLessonRequest;
import inha.dayoook_e.lesson.api.controller.dto.request.CreateLessonScheduleRequest;
import inha.dayoook_e.lesson.api.controller.dto.request.*;
import inha.dayoook_e.lesson.api.controller.dto.response.LessonResponse;
import inha.dayoook_e.lesson.api.controller.dto.response.LessonScheduleResponse;
import inha.dayoook_e.lesson.api.controller.dto.response.MeetingResponse;
import inha.dayoook_e.lesson.api.mapper.LessonMapper;
import inha.dayoook_e.lesson.domain.Lesson;
import inha.dayoook_e.lesson.domain.LessonSchedule;
import inha.dayoook_e.lesson.domain.MeetingRoom;
import inha.dayoook_e.lesson.domain.repository.*;
import inha.dayoook_e.lesson.domain.repository.LessonJpaRepository;
import inha.dayoook_e.lesson.domain.repository.LessonScheduleJpaRepository;
import inha.dayoook_e.lesson.domain.repository.MeetingRoomJpaRepository;
import inha.dayoook_e.mapping.domain.Day;
import inha.dayoook_e.mapping.domain.TimeSlot;
import inha.dayoook_e.user.domain.User;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.util.UUID;

import static inha.dayoook_e.common.BaseEntity.State.ACTIVE;
import static inha.dayoook_e.common.code.status.ErrorStatus.*;
Expand All @@ -46,6 +50,11 @@ public class LessonServiceImpl implements LessonService {
private final LessonScheduleJpaRepository lessonScheduleJpaRepository;
private final MeetingRoomJpaRepository meetingRoomJpaRepository;

private final RestTemplate restTemplate;

@Value("${fastapi.server.url}")
private String fastApiServerUrl;

/**
* 강의 생성
*
Expand All @@ -71,12 +80,13 @@ public LessonResponse createLesson(CreateLessonRequest createLessonRequest) {
* 강의 일정 생성
*
* @param user 현재 로그인한 사용자
* @param accessToken 헤더에서 추출한 토큰
* @param createLessonScheduleRequest 강의 일정 생성 요청
* @return LessonScheduleResponse
*/
@Override
@Transactional
public LessonScheduleResponse createLessonSchedule(User user, CreateLessonScheduleRequest createLessonScheduleRequest ) {
public LessonScheduleResponse createLessonSchedule(User user, String accessToken, CreateLessonScheduleRequest createLessonScheduleRequest ) {
// 1. 수업 존재 여부 확인 및 관련 정보 조회
Lesson lesson = lessonJpaRepository.findByIdAndState(createLessonScheduleRequest.lessonId(), ACTIVE)
.orElseThrow(() -> new BaseException(LESSON_NOT_FOUND));
Expand Down Expand Up @@ -112,20 +122,45 @@ public LessonScheduleResponse createLessonSchedule(User user, CreateLessonSchedu
// throw new BaseException(LESSON_SCHEDULE_ALREADY_EXISTS);
// }

// 7. 회의실 생성 (더미 데이터)
LessonSchedule lessonSchedule = lessonMapper.toLessonSchedule(lesson, null, nextClassTime);
LessonSchedule savedSchedule = lessonScheduleJpaRepository.save(lessonSchedule);

// 8. 회의실 생성
String dummyRoomUrl = "https://meet.dayoook-e.com/" + UUID.randomUUID();
MeetingRoom meetingRoom = MeetingRoom.builder()
.roomUrl(dummyRoomUrl)
.createdAt(now)
.lessonSchedule(savedSchedule) // 저장된 스케줄 참조
.build();
// 7. 회의실 생성
String meetApiUrl = fastApiServerUrl + "/api/meet/create";

// HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// 요청 바디 생성
MeetingRequest meetingRequest = lessonMapper.toMeetingRequest(user.getEmail(), lesson.getApplicationGroup().getTutee().getEmail());

// HTTP 요청 엔티티 생성
HttpEntity<MeetingRequest> requestEntity = new HttpEntity<>(meetingRequest, headers);

try {
// FastAPI 서버로 POST 요청 보내기
MeetingResponse response = restTemplate.postForObject(
meetApiUrl,
requestEntity,
MeetingResponse.class
);

meetingRoom = meetingRoomJpaRepository.save(meetingRoom);
return lessonMapper.toLessonScheduleResponse(savedSchedule, meetingRoom);
// 7. 회의실 생성 (FastAPI에서 받은 실제 미팅 URL 사용)
LessonSchedule lessonSchedule = lessonMapper.toLessonSchedule(lesson, null, nextClassTime);
LessonSchedule savedSchedule = lessonScheduleJpaRepository.save(lessonSchedule);

// 8. 회의실 생성 (실제 Google Meet URL 사용)
MeetingRoom meetingRoom = MeetingRoom.builder()
.roomUrl(response.meeting_uri())
.createdAt(LocalDateTime.now())
.lessonSchedule(savedSchedule)
.build();

meetingRoom = meetingRoomJpaRepository.save(meetingRoom);
return lessonMapper.toLessonScheduleResponse(savedSchedule, meetingRoom);

} catch (Exception e) {
log.error("Failed to create meeting room: ", e);
throw new BaseException(MEETING_ROOM_CREATION_FAILED);
}
}


Expand Down
7 changes: 6 additions & 1 deletion src/main/resources/application-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,9 @@ cloud:
credentials:
instance-profile: true
accessKey: ${S3_ACCESSKEY}
secretKey: ${S3_SECRETKEY}
secretKey: ${S3_SECRETKEY}


fastapi:
server:
url: http://localhost:6262

0 comments on commit f1f2c9d

Please sign in to comment.