Skip to content

Commit 2f0b205

Browse files
authored
Merge pull request #249 from prgrms-web-devcourse-final-project/lsj/schedule/zoom
♻️ refactor: 줌 회의장 생성 로직 변경
2 parents 8faef9d + 8c2089b commit 2f0b205

File tree

3 files changed

+43
-97
lines changed

3 files changed

+43
-97
lines changed

src/main/java/com/grepp/spring/app/controller/api/mypage/payload/response/GoogleTokenResponse.java

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/main/java/com/grepp/spring/app/model/schedule/service/ScheduleCommandService.java

Lines changed: 23 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@
33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.JsonNode;
55
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import com.grepp.spring.app.controller.api.mypage.payload.response.GoogleTokenResponse;
7-
import com.grepp.spring.app.controller.api.schedule.payload.request.AddWorkspaceRequest;
8-
import com.grepp.spring.app.controller.api.schedule.payload.request.CreateDepartLocationRequest;
9-
import com.grepp.spring.app.controller.api.schedule.payload.request.CreateSchedulesRequest;
10-
import com.grepp.spring.app.controller.api.schedule.payload.request.ModifySchedulesRequest;
11-
import com.grepp.spring.app.controller.api.schedule.payload.request.WriteSuggestedLocationRequest;
6+
import com.grepp.spring.app.controller.api.schedule.payload.request.*;
127
import com.grepp.spring.app.controller.api.schedule.payload.response.CreateOnlineMeetingRoomResponse;
138
import com.grepp.spring.app.controller.api.schedule.payload.response.CreateSchedulesResponse;
149
import com.grepp.spring.app.model.event.entity.Event;
@@ -17,68 +12,34 @@
1712
import com.grepp.spring.app.model.schedule.code.MeetingPlatform;
1813
import com.grepp.spring.app.model.schedule.code.ScheduleRole;
1914
import com.grepp.spring.app.model.schedule.code.VoteStatus;
20-
import com.grepp.spring.app.model.schedule.dto.AddWorkspaceDto;
21-
import com.grepp.spring.app.model.schedule.dto.CreateDepartLocationDto;
22-
import com.grepp.spring.app.model.schedule.dto.CreateOnlineMeetingRoomDto;
23-
import com.grepp.spring.app.model.schedule.dto.CreateScheduleDto;
24-
import com.grepp.spring.app.model.schedule.dto.DepartLocationMetroTransferDto;
25-
import com.grepp.spring.app.model.schedule.dto.ModifyScheduleDto;
26-
import com.grepp.spring.app.model.schedule.dto.ModifyWorkspaceDto;
27-
import com.grepp.spring.app.model.schedule.dto.CreateScheduleMembersDto;
28-
import com.grepp.spring.app.model.schedule.dto.SubwayStationDto;
29-
import com.grepp.spring.app.model.schedule.dto.VoteMiddleLocationDto;
30-
import com.grepp.spring.app.model.schedule.dto.WriteSuggestedLocationDto;
31-
import com.grepp.spring.app.model.schedule.dto.WriteSuggestedMetroTransferDto;
32-
import com.grepp.spring.app.model.schedule.dto.ZoomMeetingDto;
33-
import com.grepp.spring.app.model.schedule.entity.Line;
34-
import com.grepp.spring.app.model.schedule.entity.Location;
35-
import com.grepp.spring.app.model.schedule.entity.Metro;
36-
import com.grepp.spring.app.model.schedule.entity.MetroTransfer;
37-
import com.grepp.spring.app.model.schedule.entity.Schedule;
38-
import com.grepp.spring.app.model.schedule.entity.ScheduleMember;
39-
import com.grepp.spring.app.model.schedule.entity.Vote;
40-
import com.grepp.spring.app.model.schedule.entity.Workspace;
41-
import com.grepp.spring.app.model.schedule.repository.LineQueryRepository;
42-
import com.grepp.spring.app.model.schedule.repository.LocationCommandRepository;
43-
import com.grepp.spring.app.model.schedule.repository.LocationQueryRepository;
44-
import com.grepp.spring.app.model.schedule.repository.MetroQueryRepository;
45-
import com.grepp.spring.app.model.schedule.repository.MetroTransferCommandRepository;
46-
import com.grepp.spring.app.model.schedule.repository.ScheduleCommandRepository;
47-
import com.grepp.spring.app.model.schedule.repository.ScheduleMemberQueryRepository;
48-
import com.grepp.spring.app.model.schedule.repository.ScheduleMemberRepository;
49-
import com.grepp.spring.app.model.schedule.repository.ScheduleQueryRepository;
50-
import com.grepp.spring.app.model.schedule.repository.VoteCommandRepository;
51-
import com.grepp.spring.app.model.schedule.repository.VoteQueryRepository;
52-
import com.grepp.spring.app.model.schedule.repository.WorkspaceCommandRepository;
53-
import com.grepp.spring.app.model.schedule.repository.WorkspaceQueryRepository;
54-
import com.grepp.spring.infra.error.exceptions.schedule.EventNotActivatedException;
55-
import com.grepp.spring.infra.error.exceptions.schedule.VoteAlreadyProgressException;
56-
import com.grepp.spring.infra.utils.RandomPicker;
15+
import com.grepp.spring.app.model.schedule.dto.*;
16+
import com.grepp.spring.app.model.schedule.entity.*;
17+
import com.grepp.spring.app.model.schedule.repository.*;
5718
import com.grepp.spring.infra.error.exceptions.NotFoundException;
5819
import com.grepp.spring.infra.error.exceptions.group.UserNotFoundException;
20+
import com.grepp.spring.infra.error.exceptions.schedule.EventNotActivatedException;
5921
import com.grepp.spring.infra.error.exceptions.schedule.LocationNotFoundException;
22+
import com.grepp.spring.infra.error.exceptions.schedule.VoteAlreadyProgressException;
6023
import com.grepp.spring.infra.response.GroupErrorCode;
6124
import com.grepp.spring.infra.response.ScheduleErrorCode;
25+
import com.grepp.spring.infra.utils.RandomPicker;
6226
import jakarta.persistence.EntityManager;
6327
import jakarta.persistence.PersistenceContext;
64-
import java.time.format.DateTimeFormatter;
65-
import java.util.ArrayList;
66-
import java.util.List;
67-
import java.util.Optional;
6828
import lombok.RequiredArgsConstructor;
6929
import lombok.extern.slf4j.Slf4j;
7030
import org.springframework.beans.factory.annotation.Autowired;
7131
import org.springframework.beans.factory.annotation.Value;
72-
import org.springframework.http.HttpEntity;
73-
import org.springframework.http.HttpHeaders;
74-
import org.springframework.http.HttpMethod;
75-
import org.springframework.http.MediaType;
76-
import org.springframework.http.ResponseEntity;
32+
import org.springframework.http.*;
7733
import org.springframework.stereotype.Service;
7834
import org.springframework.transaction.annotation.Transactional;
7935
import org.springframework.web.client.RestTemplate;
8036
import org.springframework.web.util.UriComponentsBuilder;
8137

38+
import java.time.format.DateTimeFormatter;
39+
import java.util.ArrayList;
40+
import java.util.List;
41+
import java.util.Optional;
42+
8243
@Service
8344
@Slf4j
8445
@RequiredArgsConstructor
@@ -120,9 +81,6 @@ public class ScheduleCommandService {
12081
@Autowired
12182
private ZoomOAuthService zoomOAuthService;
12283

123-
@Value("${zoom.refresh-token}")
124-
private String zoomRefreshToken;
125-
12684
// 공통 로직
12785
private Optional<Schedule> getSchedule(Long scheduleId) {
12886
Optional<Schedule> schedule = scheduleQueryRepository.findById(scheduleId);
@@ -183,8 +141,7 @@ private void createScheduleMembers(CreateSchedulesRequest request, Schedule sche
183141

184142
if (entry.getMemberId().equals(userId)) {
185143
role = ScheduleRole.ROLE_MASTER;
186-
}
187-
else {
144+
} else {
188145
role = ScheduleRole.ROLE_MEMBER;
189146
}
190147

@@ -311,7 +268,7 @@ public void createDepartLocation(Long scheduleId, CreateDepartLocationRequest re
311268
metroTransferCommandRepository.deleteByScheduleId(scheduleId);
312269
locationCommandRepository.deleteLocation(scheduleId);
313270

314-
ScheduleMember scheduleMember = getScheduleMember(scheduleId,userId);
271+
ScheduleMember scheduleMember = getScheduleMember(scheduleId, userId);
315272
Optional<Metro> metro = getMetro(request.getDepartLocationName());
316273
setDepartLocation(request, metro, scheduleMember);
317274

@@ -378,7 +335,7 @@ private static Double getLatitude(List<ScheduleMember> scheduleLocations) {
378335
}
379336

380337
private static void setDepartLocation(CreateDepartLocationRequest request, Optional<Metro> metro,
381-
ScheduleMember scheduleMember) {
338+
ScheduleMember scheduleMember) {
382339
// DB에 존재하지 않는다면
383340
if (metro.isEmpty()) {
384341
CreateDepartLocationDto dto = CreateDepartLocationDto.toDto(request);
@@ -455,7 +412,7 @@ public void voteMiddleLocation(Schedule schedule, ScheduleMember scheduleMember,
455412
// Location 엔티티에 비관적 락을 걸고 조회하기
456413
// 파라미터를 id로 받으면 더 좋을 것 같음
457414
Location location = locationQueryRepository.findByIdWithPessimisticLock(lid.getId())
458-
.orElseThrow(() -> new IllegalArgumentException("장소를 찾을 수 없습니다."));
415+
.orElseThrow(() -> new IllegalArgumentException("장소를 찾을 수 없습니다."));
459416
// log.info("location = {}", location.toString());
460417

461418

@@ -510,8 +467,7 @@ public CreateOnlineMeetingRoomResponse createOnlineMeeting(Long scheduleId) {
510467
Schedule schedule = scheduleQueryRepository.findById(scheduleId)
511468
.orElseThrow(() -> new NotFoundException("일정을 찾을 수 없습니다. (ID: " + scheduleId + ")"));
512469

513-
GoogleTokenResponse tokenResponse = zoomOAuthService.refreshAccessToken(zoomRefreshToken);
514-
String accessToken = tokenResponse.getAccessToken();
470+
String accessToken = zoomOAuthService.getAccessToken();
515471

516472
if (accessToken == null || accessToken.trim().isEmpty()) {
517473
throw new IllegalStateException("Zoom 인증 토큰을 갱신하는데 실패했습니다. 리프레시 토큰을 확인하세요.");
@@ -551,17 +507,17 @@ public CreateOnlineMeetingRoomResponse createOnlineMeeting(Long scheduleId) {
551507

552508
@Transactional
553509
public void WriteSuggestedLocation(Schedule schedule, WriteSuggestedLocationRequest request,
554-
String userId) {
510+
String userId) {
555511

556512
List<Location> locationList = locationQueryRepository.findByScheduleId(schedule.getId());
557513
boolean bool = true;
558514

559515
for (Location l : locationList) {
560-
if(l.getVoteCount() != 0) bool = false;
516+
if (l.getVoteCount() != 0) bool = false;
561517
}
562518

563519
if (bool) {
564-
ScheduleMember scheduleMember = getScheduleMember(schedule.getId(),userId);
520+
ScheduleMember scheduleMember = getScheduleMember(schedule.getId(), userId);
565521
Member member = memberRepository.findById(userId).orElseThrow();
566522
Optional<Metro> metro = getMetro(request.getLocationName());
567523

@@ -577,15 +533,14 @@ public void WriteSuggestedLocation(Schedule schedule, WriteSuggestedLocationRequ
577533
MetroTransfer metroTransfer = WriteSuggestedMetroTransferDto.fromDto(dto);
578534
metroTransferCommandRepository.save(metroTransfer);
579535
}
580-
}
581-
else {
536+
} else {
582537
throw new VoteAlreadyProgressException(ScheduleErrorCode.VOTE_ALREADY_PROGRESS);
583538
}
584539

585540
}
586541

587542
private Location saveSuggestedLocation(Schedule schedule, WriteSuggestedLocationRequest request,
588-
Optional<Metro> metro, Member member) {
543+
Optional<Metro> metro, Member member) {
589544
Location location;
590545
// DB에 존재하지 않는다면
591546
if (metro.isEmpty()) {

src/main/java/com/grepp/spring/app/model/schedule/service/ZoomOAuthService.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.grepp.spring.app.model.schedule.service;
22

3-
import com.grepp.spring.app.controller.api.mypage.payload.response.GoogleTokenResponse;
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.Data;
45
import lombok.RequiredArgsConstructor;
56
import org.springframework.beans.factory.annotation.Value;
67
import org.springframework.http.HttpEntity;
@@ -20,24 +21,30 @@ public class ZoomOAuthService {
2021

2122
@Value("${zoom.client-id}")
2223
private String clientId;
23-
2424
@Value("${zoom.client-secret}")
2525
private String clientSecret;
26+
@Value("${zoom.account-id}")
27+
private String accountId;
2628

2729
private final RestTemplate restTemplate = new RestTemplate();
2830

29-
public GoogleTokenResponse refreshAccessToken(String refreshToken) {
31+
public String getAccessToken() {
3032
String url = "https://zoom.us/oauth/token";
3133
HttpHeaders headers = createBasicAuthHeaders();
3234
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
3335

3436
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
35-
params.add("grant_type", "refresh_token");
36-
params.add("refresh_token", refreshToken);
37+
params.add("grant_type", "account_credentials");
38+
params.add("account_id", accountId);
3739

3840
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);
39-
ResponseEntity<GoogleTokenResponse> response = restTemplate.postForEntity(url, request, GoogleTokenResponse.class);
40-
return response.getBody();
41+
42+
ResponseEntity<ZoomTokenResponse> response = restTemplate.postForEntity(url, request, ZoomTokenResponse.class);
43+
44+
if (response.getBody() != null) {
45+
return response.getBody().getAccessToken();
46+
}
47+
throw new RuntimeException("Zoom 액세스 토큰을 발급받지 못했습니다.");
4148
}
4249

4350
private HttpHeaders createBasicAuthHeaders() {
@@ -48,4 +55,10 @@ private HttpHeaders createBasicAuthHeaders() {
4855
headers.set("Authorization", authHeader);
4956
return headers;
5057
}
58+
59+
@Data
60+
private static class ZoomTokenResponse {
61+
@JsonProperty("access_token")
62+
private String accessToken;
63+
}
5164
}

0 commit comments

Comments
 (0)