Skip to content

Commit 72e4cf3

Browse files
authored
4차 배포 (#131)
2 parents c5a9af3 + edc5002 commit 72e4cf3

32 files changed

Lines changed: 866 additions & 70 deletions

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
## ⚡️변경사항 확인 바람⚡️
88

9+
- [Entity를 변경하고 다시 시작해도, db에 반영이 안되는 이유](https://github.com/UMC-CodePlay/CodePlay-BE/discussions/125)
910
- [배포 과정 설명](https://github.com/UMC-CodePlay/CodePlay-BE/discussions/52)
1011
- [Docker를 이용한 DB 세팅 방법 확인하기](https://github.com/UMC-CodePlay/CodePlay-BE/discussions/28)
1112
- [자동 스타일 포맷터 사용법 바로가기](https://github.com/UMC-CodePlay/CodePlay-BE/discussions/3#discussioncomment-11796830)

docker/local/deleteEvent.sql

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
create event clean_input_data on schedule
2+
EVERY 1 DAY STARTS CURRENT_DATE + INTERVAL 1 DAY
3+
enable
4+
do
5+
BEGIN
6+
-- 2달 이상 지난 데이터 삭제
7+
DELETE FROM music WHERE DATE(created_at) < DATE_SUB(NOW(), INTERVAL 60 DAY);
8+
DELETE FROM remix WHERE DATE(updated_at) < DATE_SUB(NOW(), INTERVAL 60 DAY);
9+
END;
10+
11+
create event clean_result_data on schedule
12+
EVERY 1 DAY STARTS CURRENT_DATE + INTERVAL 1 DAY
13+
enable
14+
do
15+
BEGIN
16+
-- 2주 이상 지난 데이터 삭제
17+
DELETE FROM harmony WHERE DATE(updated_at) < DATE_SUB(NOW(), INTERVAL 14 DAY);
18+
DELETE FROM track WHERE DATE(updated_at) < DATE_SUB(NOW(), INTERVAL 14 DAY);
19+
UPDATE remix set deleted_at = now() WHERE DATE(updated_at) < DATE_SUB(NOW(), INTERVAL 14 DAY);
20+
END;

src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ public enum ErrorStatus implements BaseErrorCode {
3737
LIKE_ALREADY_EXIST(HttpStatus.BAD_REQUEST, "LIKE401", "이미 좋아요 목록에 추가된 음원입니다."),
3838

3939
EMAIL_SEND_ERROR(HttpStatus.BAD_REQUEST, "EMAIL400", "메일 발송에 실패하였습니다."),
40-
EMAIL_CODE_ERROR(HttpStatus.BAD_REQUEST, "EMAIL401", "유효한 코드가 아닙니다.");
40+
EMAIL_CODE_ERROR(HttpStatus.BAD_REQUEST, "EMAIL401", "유효한 코드가 아닙니다."),
41+
42+
TASK_NOT_FOUND(HttpStatus.BAD_REQUEST, "TASK400", "해당 task를 찾을 수 없습니다."),
43+
HARMONY_NOT_FOUND(HttpStatus.BAD_REQUEST, "HARMONY400", "해당 화성 분석 결과를 찾을 수 없습니다."),
44+
TRACK_NOT_FOUND(HttpStatus.BAD_REQUEST, "TRACK400", "해당 트랙 분리 결과를 찾을 수 없습니다."),
45+
REMIX_NOT_FOUND(HttpStatus.BAD_REQUEST, "REMIX400", "해당 리믹스 결과를 찾을 수 없습니다.");
4146

4247
private final HttpStatus httpStatus;
4348
private final String code;

src/main/java/umc/codeplay/config/SecurityConfig.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti
6464
"/health",
6565
"/health/s3",
6666
"/auth/**",
67+
"/member/**",
6768
"/v2/api-docs",
6869
"/v3/api-docs",
6970
"/v3/api-docs/**",

src/main/java/umc/codeplay/controller/AuthController.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public ApiResponse<MemberResponseDTO.LoginResultDTO> login(
4646
throw new GeneralHandler(ErrorStatus.AUTHORIZATION_METHOD_ERROR);
4747
}
4848

49-
// 아이디/비밀번호를 사용해 AuthenticationToken 생성
49+
// 이메일/비밀번호를 사용해 AuthenticationToken 생성
5050
UsernamePasswordAuthenticationToken authToken =
5151
new UsernamePasswordAuthenticationToken(request.getEmail(), request.getPassword());
5252

@@ -56,7 +56,6 @@ public ApiResponse<MemberResponseDTO.LoginResultDTO> login(
5656

5757
// Role 정보 가져오기
5858
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
59-
6059
// 인증에 성공했다면, JWT 토큰 생성 후 반환
6160
String token = jwtUtil.generateToken(authentication.getName(), authorities);
6261
String refreshToken =
@@ -86,7 +85,7 @@ public ApiResponse<MemberResponseDTO.LoginResultDTO> refresh(
8685
if (jwtUtil.validateToken(refreshToken)
8786
&& (jwtUtil.getTypeFromToken(refreshToken).equals("refresh"))) {
8887
// 리프레시 토큰에서 사용자명 추출
89-
String usernameFromToken = jwtUtil.getUsernameFromToken(refreshToken);
88+
String usernameFromToken = jwtUtil.getEmailFromToken(refreshToken);
9089

9190
if (!email.equals(usernameFromToken)) {
9291
throw new GeneralHandler(ErrorStatus.INVALID_REFRESH_TOKEN);

src/main/java/umc/codeplay/controller/FileController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import lombok.RequiredArgsConstructor;
1010

1111
import io.swagger.v3.oas.annotations.Operation;
12+
import io.swagger.v3.oas.annotations.tags.Tag;
1213
import umc.codeplay.apiPayLoad.ApiResponse;
1314
import umc.codeplay.domain.enums.FileType;
1415
import umc.codeplay.dto.FileResponseDTO;
@@ -19,6 +20,7 @@
1920
@RestController
2021
@RequestMapping("/files")
2122
@RequiredArgsConstructor
23+
@Tag(name = "file-controller", description = "모든 파일(사진, 음성)을 s3에 올릴 때 사용하는 api")
2224
public class FileController {
2325

2426
private final FileService fileService;

src/main/java/umc/codeplay/controller/MemberController.java

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
package umc.codeplay.controller;
22

3+
import java.util.List;
4+
import java.util.Optional;
5+
36
import org.springframework.security.core.annotation.AuthenticationPrincipal;
47
import org.springframework.web.bind.annotation.*;
58

69
import lombok.RequiredArgsConstructor;
710

11+
import io.swagger.v3.oas.annotations.Operation;
812
import umc.codeplay.apiPayLoad.ApiResponse;
913
import umc.codeplay.config.security.CustomUserDetails;
1014
import umc.codeplay.converter.MemberConverter;
1115
import umc.codeplay.domain.Member;
16+
import umc.codeplay.domain.Music;
1217
import umc.codeplay.dto.MemberRequestDTO;
1318
import umc.codeplay.dto.MemberResponseDTO;
19+
import umc.codeplay.repository.MemberRepository;
20+
import umc.codeplay.repository.MusicRepository;
1421
import umc.codeplay.service.MemberService;
1522

1623
@RestController
@@ -20,18 +27,125 @@ public class MemberController {
2027

2128
private final MemberService memberService;
2229
private final MemberConverter memberConverter;
30+
private final MemberRepository memberRepository;
31+
private final MusicRepository musicRepository;
2332

33+
@Operation(summary = "유저 정보 업데이트(비밀번호 변경)", description = "기존 비밀번호, 새로운 비밀번호 입력")
2434
@PutMapping("/update")
2535
public ApiResponse<MemberResponseDTO.UpdateResultDTO> updateMember(
2636
@AuthenticationPrincipal
2737
CustomUserDetails
2838
userDetails, // 현재 로그인된 사용자 정보, email로 조회하기 위해 customUserDetails 사용
2939
@RequestBody MemberRequestDTO.UpdateMemberDTO requestDto) {
3040

41+
// userDetails.getUsername() -> 로그인된 사용자의 email
3142
Member updatedMember = memberService.updateMember(userDetails.getUsername(), requestDto);
3243
MemberResponseDTO.UpdateResultDTO responseDto =
3344
memberConverter.toUpdateResultDTO(updatedMember);
3445

3546
return ApiResponse.onSuccess(responseDto);
3647
}
48+
49+
@Operation(summary = "마이페이지 화성분석 탭 결과", description = "로그인한 상태에서 마이페이지")
50+
@GetMapping("/mypage/harmony")
51+
public ApiResponse<List<MemberResponseDTO.GetMyHarmonyDTO>> getMyHarmony(
52+
@AuthenticationPrincipal CustomUserDetails userDetails) {
53+
54+
String email = userDetails.getUsername();
55+
56+
Optional<Member> optionalMember = memberRepository.findByEmail(email);
57+
if (optionalMember.isEmpty()) {
58+
throw new RuntimeException("사용자를 찾을 수 없습니다.");
59+
}
60+
Member member = optionalMember.get();
61+
62+
List<MemberResponseDTO.GetMyHarmonyDTO> results = memberService.getMyHarmony(member);
63+
64+
return ApiResponse.onSuccess(results);
65+
}
66+
67+
@Operation(summary = "마이페이지 세션분리 탭 결과", description = "로그인한 상태에서 마이페이지")
68+
@GetMapping("/mypage/track")
69+
public ApiResponse<List<MemberResponseDTO.GetMyTrackDTO>> getMyTracks(
70+
@AuthenticationPrincipal CustomUserDetails userDetails) {
71+
72+
String email = userDetails.getUsername();
73+
74+
Optional<Member> optionalMember = memberRepository.findByEmail(email);
75+
if (optionalMember.isEmpty()) {
76+
throw new RuntimeException("사용자를 찾을 수 없습니다.");
77+
}
78+
Member member = optionalMember.get();
79+
80+
List<MemberResponseDTO.GetMyTrackDTO> results = memberService.getMyTrack(member);
81+
82+
return ApiResponse.onSuccess(results);
83+
}
84+
85+
@Operation(summary = "마이페이지 전체 검색", description = "파라미터 musicTitle에 음원 제목으로 검색")
86+
@GetMapping("/mypage/search")
87+
public ApiResponse<MemberResponseDTO.GetAllByMusicTitleDTO> getByMusicTitle(
88+
@AuthenticationPrincipal CustomUserDetails userDetails,
89+
@RequestParam String musicTitle) {
90+
91+
// 현재 로그인한 사용자 검색
92+
String email = userDetails.getUsername();
93+
94+
Optional<Member> optionalMember = memberRepository.findByEmail(email);
95+
if (optionalMember.isEmpty()) {
96+
throw new RuntimeException("사용자를 찾을 수 없습니다.");
97+
}
98+
Member member = optionalMember.get();
99+
100+
Music music = musicRepository.findByTitle(musicTitle);
101+
102+
MemberResponseDTO.GetAllByMusicTitleDTO results =
103+
memberService.getAllByMusicTitle(member, music);
104+
105+
return ApiResponse.onSuccess(results);
106+
}
107+
108+
@Operation(summary = "마이페이지 화성분석 검색", description = "파라미터 musicTitle에 음원 제목으로 검색")
109+
@GetMapping("/mypage/harmony/search")
110+
public ApiResponse<List<MemberResponseDTO.GetMyHarmonyDTO>> getHarmonyByMusicTitle(
111+
@AuthenticationPrincipal CustomUserDetails userDetails,
112+
@RequestParam String musicTitle) {
113+
// 현재 로그인한 사용자 검색
114+
String email = userDetails.getUsername();
115+
116+
Optional<Member> optionalMember = memberRepository.findByEmail(email);
117+
if (optionalMember.isEmpty()) {
118+
throw new RuntimeException("사용자를 찾을 수 없습니다.");
119+
}
120+
Member member = optionalMember.get();
121+
122+
Music music = musicRepository.findByTitle(musicTitle);
123+
124+
List<MemberResponseDTO.GetMyHarmonyDTO> results =
125+
memberService.getHarmonyByMusicTitle(member, music);
126+
127+
return ApiResponse.onSuccess(results);
128+
}
129+
130+
@Operation(summary = "마이페이지 세션분리 검색", description = "파라미터 musicTitle에 음원 제목으로 검색")
131+
@GetMapping("/mypage/track/search")
132+
public ApiResponse<List<MemberResponseDTO.GetMyTrackDTO>> getTrackByMusicTitle(
133+
@AuthenticationPrincipal CustomUserDetails userDetails,
134+
@RequestParam String musicTitle) {
135+
// 현재 로그인한 사용자 검색
136+
String email = userDetails.getUsername();
137+
138+
Optional<Member> optionalMember = memberRepository.findByEmail(email);
139+
if (optionalMember.isEmpty()) {
140+
throw new RuntimeException("사용자를 찾을 수 없습니다.");
141+
}
142+
Member member = optionalMember.get();
143+
144+
Music music = musicRepository.findByTitle(musicTitle);
145+
146+
List<MemberResponseDTO.GetMyTrackDTO> results =
147+
memberService.getTrackByMusicTitle(member, music);
148+
149+
return ApiResponse.onSuccess(results);
150+
}
37151
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package umc.codeplay.controller;
2+
3+
import org.springframework.web.bind.annotation.PostMapping;
4+
import org.springframework.web.bind.annotation.RequestBody;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
import lombok.RequiredArgsConstructor;
9+
10+
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.tags.Tag;
12+
import umc.codeplay.apiPayLoad.ApiResponse;
13+
import umc.codeplay.dto.ModelRequestDTO;
14+
import umc.codeplay.dto.ModelResponseDTO;
15+
import umc.codeplay.service.ModelService;
16+
17+
@RestController
18+
@RequiredArgsConstructor
19+
@RequestMapping("/python-model")
20+
@Tag(name = "py-model-controller", description = "Python 로컬 서버의 분석 결과를 저장하는 API (프론트엔드 사용 X)")
21+
public class ModelResultController {
22+
23+
private final ModelService modelService;
24+
25+
@Operation(
26+
summary = "화성 분석 결과 저장",
27+
description = "Python 서버의 화성 분석 결과를 저장합니다. 프론트엔드에서 사용하지 않습니다.")
28+
@PostMapping("/harmony")
29+
public ApiResponse<ModelResponseDTO.HarmonyResponseDTO> updateHarmony(
30+
@RequestBody ModelRequestDTO.HarmonyRequestDTO harmonyRequestDTO) {
31+
32+
return ApiResponse.onSuccess(
33+
ModelResponseDTO.HarmonyResponseDTO.builder()
34+
.harmonyId(modelService.setHarmony(harmonyRequestDTO))
35+
.build());
36+
}
37+
38+
@Operation(
39+
summary = "세션 분리 결과 저장",
40+
description = "Python 서버의 세션 분리 결과를 저장합니다. 프론트엔드에서 사용하지 않습니다.")
41+
@PostMapping("/tracks")
42+
public ApiResponse<ModelResponseDTO.TrackResponseDTO> updateTrack(
43+
@RequestBody ModelRequestDTO.TrackRequestDTO trackRequestDTO) {
44+
45+
return ApiResponse.onSuccess(
46+
ModelResponseDTO.TrackResponseDTO.builder()
47+
.trackId(modelService.setTrack(trackRequestDTO))
48+
.build());
49+
}
50+
51+
@Operation(summary = "리믹스 결과 저장", description = "Python 서버의 리믹스 결과를 저장합니다. 프론트엔드에서 사용하지 않습니다.")
52+
@PostMapping("/remix")
53+
public ApiResponse<ModelResponseDTO.RemixResponseDTO> updateTrack(
54+
@RequestBody ModelRequestDTO.RemixRequestDTO remixRequestDTO) {
55+
56+
return ApiResponse.onSuccess(
57+
ModelResponseDTO.RemixResponseDTO.builder()
58+
.remixId(modelService.setRemix(remixRequestDTO))
59+
.build());
60+
}
61+
}

src/main/java/umc/codeplay/controller/OAuthController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ public ApiResponse<MemberResponseDTO.LoginResultDTO> OAuthCallback(
7474
String accessToken = (String) tokenResponse.get("access_token");
7575
Map<String, Object> userInfo = requestOAuthUserInfo(accessToken, properties);
7676
String email = null;
77-
String name = null;
77+
// String name = null;
7878
switch (provider) {
7979
case "google" -> {
8080
// (3-a) 구글 UserInfo Endpoint 로 이메일, 프로필 등 조회
8181
email = (String) userInfo.get("email");
82-
name = (String) userInfo.get("name");
82+
// name = (String) userInfo.get("name");
8383
}
8484
case "kakao" -> {
8585
// (3-b) 카카오 UserInfo Endpoint 로 이메일, 프로필 등 조회
@@ -88,14 +88,14 @@ public ApiResponse<MemberResponseDTO.LoginResultDTO> OAuthCallback(
8888
Map<String, Object> kakaoProperties =
8989
(Map<String, Object>) userInfo.get("properties");
9090
email = (String) kakaoAccount.get("email");
91-
name = (String) kakaoProperties.get("nickname");
91+
// name = (String) kakaoProperties.get("nickname");
9292
}
9393
}
9494

9595
// (4) 우리 DB에서 회원 조회 or 생성
9696
Member member =
9797
memberService.findOrCreateOAuthMember(
98-
email, name, SocialStatus.valueOf(provider.toUpperCase()));
98+
email, SocialStatus.valueOf(provider.toUpperCase()));
9999

100100
// (5) JWTUtil 이용해서 Access/Refresh 토큰 발급
101101
var authorities = List.of(new SimpleGrantedAuthority("ROLE_" + member.getRole().name()));

0 commit comments

Comments
 (0)