From 6493b3223c80624a323233b8ef288eeec0992df3 Mon Sep 17 00:00:00 2001 From: gdakate Date: Tue, 21 Mar 2023 14:52:58 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[refactor]=20=ED=97=A4=EB=8D=94=20response?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20#29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HighLight/common/ApiBody.java | 18 +++++++++ .../HighLight/common/ApiHeader.java | 21 ++++++++++ .../HighLight/common/ApiResponse.java | 39 ++++++++++++++----- .../HighLight/common/Success.java | 14 +++++++ 4 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java b/src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java new file mode 100644 index 0000000..84f261e --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java @@ -0,0 +1,18 @@ +package com.SollutionChallenge.HighLight.common; + +public class ApiBody { + private T data; + private T msg; + + public ApiBody(T data, T msg){ + this.data = data; + this.msg = msg; + } + + public T getData(){ + return data; + } + public T getMsg(){ + return msg; + } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java b/src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java new file mode 100644 index 0000000..2de1080 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java @@ -0,0 +1,21 @@ +package com.SollutionChallenge.HighLight.common; + +import org.springframework.http.HttpStatus; + +public class ApiHeader { + private HttpStatus status; + private String message; + + public ApiHeader(HttpStatus status, String message) { + this.status = status; + this.message = message; + } + + public HttpStatus getStatus() { + return status; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java b/src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java index 837f6a5..2f8e24b 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java +++ b/src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java @@ -1,5 +1,7 @@ package com.SollutionChallenge.HighLight.common; +import com.SollutionChallenge.HighLight.Folder.FolderResponseDto; + import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -7,18 +9,35 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ApiResponse { - private int status; - private T data; - private String message; - - private ApiResponse(int status, String message, T data) { - this.status = status; - this.data = data; - this.message = message; + private ApiHeader header; + private ApiBody body; + private static int SUCCESS =200; + + // private int status; + // private T data; + // private String message; + + // private ApiResponse(int status, String message, T data) { + // this.status = status; + // this.data = data; + // this.message = message; + // } + + private ApiResponse(ApiHeader header, ApiBody body){ + this.header = header; + this.body=body; } - public static ApiResponse successCode(Success success, T data){ - return new ApiResponse<>(success.getStatus().value(), success.getMessage(),null); + public ApiResponse(ApiHeader header){ + this.header = header; + } + + // public static ApiResponse successCode(Success success, T data){ + // return new ApiResponse<>(success.getStatus().value(), success.getMessage(),null); + // } + + public static ApiResponse successCode(Success success, FolderResponseDto response){ + return new ApiResponse(new ApiHeader(success.getStatus(), success.getMessage()), new ApiBody(null, success.getMessage())); } } diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/Success.java b/src/main/java/com/SollutionChallenge/HighLight/common/Success.java index 07091ae..064c1b7 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/common/Success.java +++ b/src/main/java/com/SollutionChallenge/HighLight/common/Success.java @@ -4,6 +4,8 @@ import org.springframework.http.HttpStatus; +import com.google.api.Http; + import lombok.AllArgsConstructor; import lombok.Getter; @@ -17,4 +19,16 @@ public enum Success { private final HttpStatus status; private final String message; + + // Success(HttpStatus status, String message){ + // this.status = status; + // this.message=message; + // } + // public HttpStatus getStatus(){ + // return status; + // } + // + // public String getMessage(){ + // return message; + // } } From 71c3a796c815a39618f57a6c93f88d4731e545e5 Mon Sep 17 00:00:00 2001 From: gdakate Date: Sun, 26 Mar 2023 08:24:44 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[feat=20&=20refactor]=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EB=93=B1=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20API=20with=20mySQL?= =?UTF-8?q?=20ver.=20#29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 +- .../HighLight/Folder/Folder.java | 48 +++++++++ .../HighLight/Folder/FolderController.java | 36 +++++++ .../HighLight/Folder/FolderRepository.java | 15 +++ .../HighLight/Folder/FolderRequestDto.java | 19 ++++ .../HighLight/Folder/FolderResponseDto.java | 24 +++++ .../HighLight/Folder/FolderService.java | 68 +++++++++++++ .../Folder/FolderViewResponseDto.java | 19 ++++ .../HighLight/HighLightApplication.java | 9 +- .../HighLight/User/User.java | 57 +++++++++++ .../HighLight/User/UserController.java | 26 +++++ .../HighLight/User/UserRepository.java | 7 ++ .../HighLight/User/UserService.java | 4 + .../HighLight/auth/ConfigUtils.java | 80 +++++++++++++++ .../HighLight/auth/GoogleController.java | 99 +++++++++++++++++++ .../HighLight/auth/GoogleLoginDto.java | 28 ++++++ .../HighLight/auth/GoogleLoginRequest.java | 22 +++++ .../HighLight/auth/GoogleLoginResponse.java | 15 +++ .../HighLight/auth/SecurityUtil.java | 17 ++++ .../HighLight/common/ApiBody.java | 18 ++++ .../HighLight/common/ApiHeader.java | 21 ++++ .../HighLight/common/ApiResponse.java | 43 ++++++++ .../HighLight/common/AuthService.java | 21 ++++ .../HighLight/common/Success.java | 32 ++++++ .../HighLight/FolderServiceTest.java | 24 +++++ 25 files changed, 753 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRepository.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/User/User.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/User/UserController.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/User/UserRepository.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/User/UserService.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/auth/ConfigUtils.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/auth/GoogleController.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginDto.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginRequest.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginResponse.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/auth/SecurityUtil.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/common/AuthService.java create mode 100644 src/main/java/com/SollutionChallenge/HighLight/common/Success.java create mode 100644 src/test/java/com/SollutionChallenge/HighLight/FolderServiceTest.java diff --git a/build.gradle b/build.gradle index 9ba22ed..9222ab9 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' compileOnly 'org.projectlombok:lombok' - implementation 'org.springframework.session:spring-session-jdbc' +// implementation 'org.springframework.session:spring-session-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-data-redis' // implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' @@ -34,8 +34,12 @@ dependencies { implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter', version: '1.2.5.RELEASE' implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-storage', version: '1.2.5.RELEASE' annotationProcessor 'org.projectlombok:lombok' +// runtimeOnly 'com.h2database:h2' + implementation 'mysql:mysql-connector-java' } + + tasks.named('test') { // outputs.dir snippetsDir useJUnitPlatform() diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java new file mode 100644 index 0000000..4bc9fbd --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java @@ -0,0 +1,48 @@ +package com.SollutionChallenge.HighLight.Folder; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import com.SollutionChallenge.HighLight.User.User; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "Folder") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class Folder { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "folder_id",nullable = false, unique = true) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User userId; + + @Column(nullable = false) + private String name; + + + public static Folder createFolder( User userId, String name){ + Folder folder = new Folder(); + // folder.id = id; + folder.userId=userId; + folder.name=name; + + return folder; + } + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java new file mode 100644 index 0000000..ec9d865 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java @@ -0,0 +1,36 @@ +package com.SollutionChallenge.HighLight.Folder; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +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 com.SollutionChallenge.HighLight.common.ApiResponse; +import com.SollutionChallenge.HighLight.common.Success; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class FolderController { + private final FolderService folderService; + + @PostMapping("/folder") + private ApiResponse createFolder(@RequestBody FolderRequestDto folderRequestDto){ + FolderResponseDto response = folderService.save(folderRequestDto); + return ApiResponse.successCode(Success.CREATE_FOLDER_SUCCESS,response); + } + + @GetMapping("/folder") + private ApiResponse getFolder(){ + FolderViewResponseDto response = folderService.viewFolder(); + return ApiResponse.successCode(Success.GET_FOLDER_SUCCESS,response); + } + + // @GetMapping("/folder") + // private Folder getFolder(){ + // return folderService.getFolder(); + // } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRepository.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRepository.java new file mode 100644 index 0000000..fe18489 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRepository.java @@ -0,0 +1,15 @@ +package com.SollutionChallenge.HighLight.Folder; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Repository; + +import com.sun.istack.NotNull; + +@Repository +public interface FolderRepository extends JpaRepository { + // List findAll(); + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java new file mode 100644 index 0000000..f8d98de --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java @@ -0,0 +1,19 @@ +package com.SollutionChallenge.HighLight.Folder; + +import com.SollutionChallenge.HighLight.User.User; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class FolderRequestDto { + + private User userId; + private String folderName; + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java new file mode 100644 index 0000000..30b34e1 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java @@ -0,0 +1,24 @@ +package com.SollutionChallenge.HighLight.Folder; + +import java.util.List; + +import com.SollutionChallenge.HighLight.User.User; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class FolderResponseDto { + private Long id; + private String folderName; + + public static FolderResponseDto from(Long id, String folderName){ + FolderResponseDto folderResponseDto = new FolderResponseDto(); + folderResponseDto.id = id; + folderResponseDto.folderName = folderName; + return folderResponseDto; + } +} + diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java new file mode 100644 index 0000000..61dee27 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java @@ -0,0 +1,68 @@ +package com.SollutionChallenge.HighLight.Folder; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.SollutionChallenge.HighLight.User.User; +import com.SollutionChallenge.HighLight.User.UserRepository; +import com.SollutionChallenge.HighLight.auth.ConfigUtils; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Service +public class FolderService { + + private final FolderRepository folderRepository; + // private final + private final Folder folder; + // private final UserRepository userRepository; + + @Autowired + public FolderService(FolderRepository folderRepository) { + this.folderRepository = folderRepository; + this.folder = Folder.createFolder(null, null); + } + + // @Transactional + // public FolderResponseDto save(FolderRequestDto folderRequestDto) { + // String folderName = folderRequestDto.getFolderName(); + // return FolderResponseDto.from( folderName); + // } + + // public FolderViewResponseDto viewFolder() { + // String id = folder.getName(); + // List folderName= folderRepository.findAll(); + // return FolderViewResponseDto.of(folderName); + // } + + @Transactional + public FolderResponseDto save(FolderRequestDto folderRequestDto) { + User userId = folder.getUserId(); // 해당 폴더를 생성한 유저 정보 + String folderName = folderRequestDto.getFolderName(); + Folder savedFolder = folderRepository.save(Folder.createFolder(userId, folderName)); + return FolderResponseDto.from(savedFolder.getId(), savedFolder.getName()); + } + + + public FolderViewResponseDto viewFolder() { + List folders = folderRepository.findAll(); + List folderNames = Collections.emptyList(); + if (folders != null && !folders.isEmpty()) { + folderNames = folders.stream() + .filter(f -> f.getName() != null) + .map(Folder::getName) + .collect(Collectors.toList()); + } + return FolderViewResponseDto.of(folderNames); + } + + + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java new file mode 100644 index 0000000..1a0729e --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java @@ -0,0 +1,19 @@ +package com.SollutionChallenge.HighLight.Folder; + +import java.util.List; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class FolderViewResponseDto { + private List folderName; + + public static FolderViewResponseDto of(ListfolderName){ + FolderViewResponseDto folderViewResponseDto = new FolderViewResponseDto(); + folderViewResponseDto.folderName = folderName; + return folderViewResponseDto; + } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/HighLightApplication.java b/src/main/java/com/SollutionChallenge/HighLight/HighLightApplication.java index f604e35..e38b0ec 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/HighLightApplication.java +++ b/src/main/java/com/SollutionChallenge/HighLight/HighLightApplication.java @@ -6,14 +6,15 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - -@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) -@ComponentScan(basePackages = "com.SollutionChallenge.HighLight") +// @EnableJpaAuditing +@SpringBootApplication +@EnableAutoConfiguration public class HighLightApplication { - public static void main(String[] args) { SpringApplication.run(HighLightApplication.class, args); + } } diff --git a/src/main/java/com/SollutionChallenge/HighLight/User/User.java b/src/main/java/com/SollutionChallenge/HighLight/User/User.java new file mode 100644 index 0000000..f0fae12 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/User/User.java @@ -0,0 +1,57 @@ +package com.SollutionChallenge.HighLight.User; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String email; + + @Column + private String picture; + + /* + @Enumerated(EnumType.STRING) + JPA로 데이터베이스로 저장할 때 Enum 값을 어떤 형태로 저장할지를 결정함 + 기본적으로는 int로 된 숫자가 저장된다. + 숫자로 저장되면 데이터베이스로 확인할 때 그 값이 무슨 코드를 의미하는지 알 수 가 없다. + 그래서 문자열로 저장될 수 있도록 선언 + */ + + + @Builder + public User(String name, String email, String picture){ + this.name = name; + this.email = email; + this.picture = picture; + + } + + public User update(String name, String picture){ + this.name = name; + this.picture = picture; + + return this; + } + + + +} \ No newline at end of file diff --git a/src/main/java/com/SollutionChallenge/HighLight/User/UserController.java b/src/main/java/com/SollutionChallenge/HighLight/User/UserController.java new file mode 100644 index 0000000..91a1105 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/User/UserController.java @@ -0,0 +1,26 @@ +package com.SollutionChallenge.HighLight.User; + +import org.springframework.beans.factory.annotation.Autowired; +// import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class UserController { + + private UserRepository userRepository; + // @Autowired private BCryptPasswordEncoder bCryptPasswordEncoder; + + //new + @GetMapping("/login") + public String loginPage(){ + return "login"; + } + + // @GetMapping("/oauth2/redirect") + // public String oauth2Redirect(@AuthenticationPrincipal OAuth2User principal){ + // String email = principal.getAttribute("email"); + // String name = principal.getAttribute("name"); + // } + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/User/UserRepository.java b/src/main/java/com/SollutionChallenge/HighLight/User/UserRepository.java new file mode 100644 index 0000000..fd71139 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/User/UserRepository.java @@ -0,0 +1,7 @@ +package com.SollutionChallenge.HighLight.User; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/User/UserService.java b/src/main/java/com/SollutionChallenge/HighLight/User/UserService.java new file mode 100644 index 0000000..9ec2917 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/User/UserService.java @@ -0,0 +1,4 @@ +package com.SollutionChallenge.HighLight.User; + +public class UserService { +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/auth/ConfigUtils.java b/src/main/java/com/SollutionChallenge/HighLight/auth/ConfigUtils.java new file mode 100644 index 0000000..bc4ca1a --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/auth/ConfigUtils.java @@ -0,0 +1,80 @@ +package com.SollutionChallenge.HighLight.auth; + +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Component; + +import com.google.api.client.util.Value; + +@Component +public class ConfigUtils { + @Value("${google.auth.url}") + private String googleAuthUrl; + + @Value("${google.login.url}") + private String googleLoginUrl; + + @Value("${google.redirect.uri}") + private String googleRedirectUrl; + + @Value("${google.client.id}") + private String googleClientId; + + @Value("${google.secret}") + private String googleSecret; + + @Value("${google.auth.scope}") + private String scopes; + + // Google 로그인 URL 생성 로직 + public String googleInitUrl() { + Map params = new HashMap<>(); + params.put("client_id", getGoogleClientId()); + params.put("redirect_uri", getGoogleRedirectUri()); + params.put("response_type", "code"); + params.put("scope", getScopeUrl()); + + String paramStr = params.entrySet().stream() + .map(param -> param.getKey() + "=" + param.getValue()) + .collect(Collectors.joining("&")); + + return getGoogleLoginUrl() + + "/o/oauth2/v2/auth" + + "?" + + paramStr; + } + + public String getGoogleAuthUrl() { + return googleAuthUrl; + } + + public String getGoogleLoginUrl() { + return googleLoginUrl; + } + + public String getGoogleClientId() { + return googleClientId; + } + + public String getGoogleRedirectUri() { + return googleRedirectUrl; + } + + public String getGoogleSecret() { + return googleSecret; + } + + // scope의 값을 보내기 위해 띄어쓰기 값을 UTF-8로 변환하는 로직 포함 + public String getScopeUrl() { + // return scopes.stream().collect(Collectors.joining(",")) + // .replaceAll(",", "%20"); + return scopes.replaceAll(",", "%20"); + } + // public User toEntity(GoogleLoginRequest oauth2UserInfo) { + // return User.builder() + // .socialId(oauth2UserInfo.getId()) + // .build(); + // } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleController.java b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleController.java new file mode 100644 index 0000000..0ec2dad --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleController.java @@ -0,0 +1,99 @@ +package com.SollutionChallenge.HighLight.auth; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; + +@Controller +@RequestMapping(value = "/google") +public class GoogleController { + + private final ConfigUtils configUtils; + + GoogleController(ConfigUtils configUtils) { + this.configUtils = configUtils; + } + + @GetMapping(value = "/login") + public ResponseEntity moveGoogleInitUrl() { + String authUrl = configUtils.googleInitUrl(); + URI redirectUri = null; + try { + redirectUri = new URI(authUrl); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setLocation(redirectUri); + return new ResponseEntity<>(httpHeaders, HttpStatus.SEE_OTHER); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + return ResponseEntity.badRequest().build(); + } + + @GetMapping(value = "/login/redirect") + public ResponseEntity redirectGoogleLogin( + @RequestParam(value = "code") String authCode + ) { + // HTTP 통신을 위해 RestTemplate 활용 + RestTemplate restTemplate = new RestTemplate(); + GoogleLoginRequest requestParams = GoogleLoginRequest.builder() + .clientId(configUtils.getGoogleClientId()) + .clientSecret(configUtils.getGoogleSecret()) + .code(authCode) + .redirectUri(configUtils.getGoogleRedirectUri()) + .grantType("authorization_code") + .build(); + + try { + // Http Header 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity httpRequestEntity = new HttpEntity<>(requestParams, headers); + ResponseEntity apiResponseJson = restTemplate.postForEntity(configUtils.getGoogleAuthUrl() + "/token", httpRequestEntity, String.class); + + // ObjectMapper를 통해 String to Object로 변환 + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // NULL이 아닌 값만 응답받기(NULL인 경우는 생략) + GoogleLoginResponse googleLoginResponse = objectMapper.readValue(apiResponseJson.getBody(), new TypeReference() {}); + + // 사용자의 정보는 JWT Token으로 저장되어 있고, Id_Token에 값을 저장한다. + String jwtToken = googleLoginResponse.getIdToken(); + + // JWT Token을 전달해 JWT 저장된 사용자 정보 확인 + String requestUrl = UriComponentsBuilder.fromHttpUrl(configUtils.getGoogleAuthUrl() + "/tokeninfo").queryParam("id_token", jwtToken).toUriString(); + + String resultJson = restTemplate.getForObject(requestUrl, String.class); + + if(resultJson != null) { + GoogleLoginDto userInfoDto = objectMapper.readValue(resultJson, new TypeReference() {}); + + return ResponseEntity.ok().body(userInfoDto); + } + else { + throw new Exception("Google OAuth failed!"); + } + } + catch (Exception e) { + e.printStackTrace(); + } + + return ResponseEntity.badRequest().body(null); + } +} \ No newline at end of file diff --git a/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginDto.java b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginDto.java new file mode 100644 index 0000000..7ff04d6 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginDto.java @@ -0,0 +1,28 @@ +package com.SollutionChallenge.HighLight.auth; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class GoogleLoginDto { + + private String iss; + private String azp; + private String aud; + private String sub; + private String email; + private String emailVerified; + private String atHash; + private String name; + private String picture; + private String givenName; + private String familyName; + private String locale; + private String iat; + private String exp; + private String alg; + private String kid; + private String typ; + +} \ No newline at end of file diff --git a/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginRequest.java b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginRequest.java new file mode 100644 index 0000000..dac74a0 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginRequest.java @@ -0,0 +1,22 @@ +package com.SollutionChallenge.HighLight.auth; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class GoogleLoginRequest { + + private String clientId; // 애플리케이션의 클라이언트 ID + private String redirectUri; // Google 로그인 후 redirect 위치 + private String clientSecret; // 클라이언트 보안 비밀 + private String responseType; // Google OAuth 2.0 엔드포인트가 인증 코드를 반환하는지 여부 + private String scope; // OAuth 동의범위 + private String code; + private String accessType; // 사용자가 브라우저에 없을 때 애플리케이션이 액세스 토큰을 새로 고칠 수 있는지 여부 + private String grantType; + private String state; + private String includeGrantedScopes; // 애플리케이션이 컨텍스트에서 추가 범위에 대한 액세스를 요청하기 위해 추가 권한 부여를 사용 + private String loginHint; // 애플리케이션이 인증하려는 사용자를 알고 있는 경우 이 매개변수를 사용하여 Google 인증 서버에 힌트를 제공 + private String prompt; // default: 처음으로 액세스를 요청할 때만 사용자에게 메시지가 표시 +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginResponse.java b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginResponse.java new file mode 100644 index 0000000..0404e09 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/auth/GoogleLoginResponse.java @@ -0,0 +1,15 @@ +package com.SollutionChallenge.HighLight.auth; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class GoogleLoginResponse { + private String accessToken; // 애플리케이션이 Google API 요청을 승인하기 위해 보내는 토큰 + private String expiresIn; // Access Token의 남은 수명 + private String refreshToken; // 새 액세스 토큰을 얻는 데 사용할 수 있는 토큰 + private String scope; + private String tokenType; // 반환된 토큰 유형(Bearer 고정) + private String idToken; +} \ No newline at end of file diff --git a/src/main/java/com/SollutionChallenge/HighLight/auth/SecurityUtil.java b/src/main/java/com/SollutionChallenge/HighLight/auth/SecurityUtil.java new file mode 100644 index 0000000..be4ca34 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/auth/SecurityUtil.java @@ -0,0 +1,17 @@ +// package com.SollutionChallenge.HighLight.auth; +// +// import org.springframework.security.core.Authentication; +// import org.springframework.security.core.context.SecurityContextHolder; +// +// +// public class SecurityUtil { +// private SecurityUtil(){ +// +// } +// +// public static String getCurrentUserId() { +// final Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); +// +// return authentication.getName(); +// } +// } diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java b/src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java new file mode 100644 index 0000000..84f261e --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/common/ApiBody.java @@ -0,0 +1,18 @@ +package com.SollutionChallenge.HighLight.common; + +public class ApiBody { + private T data; + private T msg; + + public ApiBody(T data, T msg){ + this.data = data; + this.msg = msg; + } + + public T getData(){ + return data; + } + public T getMsg(){ + return msg; + } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java b/src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java new file mode 100644 index 0000000..2de1080 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/common/ApiHeader.java @@ -0,0 +1,21 @@ +package com.SollutionChallenge.HighLight.common; + +import org.springframework.http.HttpStatus; + +public class ApiHeader { + private HttpStatus status; + private String message; + + public ApiHeader(HttpStatus status, String message) { + this.status = status; + this.message = message; + } + + public HttpStatus getStatus() { + return status; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java b/src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java new file mode 100644 index 0000000..7f9b746 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/common/ApiResponse.java @@ -0,0 +1,43 @@ +package com.SollutionChallenge.HighLight.common; + +import com.SollutionChallenge.HighLight.Folder.FolderResponseDto; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ApiResponse { + private ApiHeader header; + private ApiBody body; + private static int SUCCESS =200; + + // private int status; + // private T data; + // private String message; + + // private ApiResponse(int status, String message, T data) { + // this.status = status; + // this.data = data; + // this.message = message; + // } + + private ApiResponse(ApiHeader header, ApiBody body){ + this.header = header; + this.body=body; + } + + public ApiResponse(ApiHeader header){ + this.header = header; + } + + // public static ApiResponse successCode(Success success, T data){ + // return new ApiResponse<>(success.getStatus().value(), success.getMessage(),null); + // } + + public static ApiResponse successCode(Success success, T data){ + return new ApiResponse(new ApiHeader(success.getStatus(), success.getMessage()), new ApiBody(data, success.getMessage())); + } + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/AuthService.java b/src/main/java/com/SollutionChallenge/HighLight/common/AuthService.java new file mode 100644 index 0000000..a3d10ec --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/common/AuthService.java @@ -0,0 +1,21 @@ +package com.SollutionChallenge.HighLight.common; + +import org.springframework.stereotype.Service; + +import com.SollutionChallenge.HighLight.User.UserRepository; +import com.SollutionChallenge.HighLight.auth.ConfigUtils; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class AuthService { + UserRepository userRepository; + ConfigUtils configUtils; + + // @Transactional + // public User findUser(){ + // return userRepository.findById(SecurityUtil.getCurrentUserId()) + // } + +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/common/Success.java b/src/main/java/com/SollutionChallenge/HighLight/common/Success.java new file mode 100644 index 0000000..7f5bc67 --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/common/Success.java @@ -0,0 +1,32 @@ +package com.SollutionChallenge.HighLight.common; + +import static org.springframework.http.HttpStatus.*; + +import org.springframework.http.HttpStatus; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum Success { + + CREATE_FOLDER_SUCCESS(OK,"폴더 생성 성공"), + GET_FOLDER_SUCCESS(OK,"폴더 조회 성공"), + DELETE_FOLDER_SUCCESS(OK,"폴더 삭제 성공"); + + private final HttpStatus status; + private final String message; + + // Success(HttpStatus status, String message){ + // this.status = status; + // this.message=message; + // } + // public HttpStatus getStatus(){ + // return status; + // } + // + // public String getMessage(){ + // return message; + // } +} diff --git a/src/test/java/com/SollutionChallenge/HighLight/FolderServiceTest.java b/src/test/java/com/SollutionChallenge/HighLight/FolderServiceTest.java new file mode 100644 index 0000000..bcbfd33 --- /dev/null +++ b/src/test/java/com/SollutionChallenge/HighLight/FolderServiceTest.java @@ -0,0 +1,24 @@ +package com.SollutionChallenge.HighLight; + +import java.lang.reflect.Member; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.SollutionChallenge.HighLight.Folder.Folder; +import com.SollutionChallenge.HighLight.Folder.FolderRepository; +import static org.assertj.core.api.Assertions.assertThat; + + +public class FolderServiceTest { + FolderRepository folderRepository; + Folder folder; + + @Test + void findAll() { + folderRepository.save(folder); + List list = folderRepository.findAll(); + assertThat(list.size()).isEqualTo(0); + } + +} From 1a4a03a58a41525eafebebb720ab0316aef3b395 Mon Sep 17 00:00:00 2001 From: gdakate Date: Sun, 26 Mar 2023 09:37:29 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[feat=20&=20refactor]=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EB=93=B1=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20API=20with=20h2=20?= =?UTF-8?q?success=20#29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 ++-- .../HighLight/Folder/Folder.java | 2 +- .../HighLight/Folder/FolderRequestDto.java | 2 +- src/main/resources/application.properties | 21 ++++++++++++++++--- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 9222ab9..9a4990e 100644 --- a/build.gradle +++ b/build.gradle @@ -34,8 +34,8 @@ dependencies { implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter', version: '1.2.5.RELEASE' implementation group: 'org.springframework.cloud', name: 'spring-cloud-gcp-storage', version: '1.2.5.RELEASE' annotationProcessor 'org.projectlombok:lombok' -// runtimeOnly 'com.h2database:h2' - implementation 'mysql:mysql-connector-java' + runtimeOnly 'com.h2database:h2' +// implementation 'mysql:mysql-connector-java' } diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java index 4bc9fbd..2e42fec 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/Folder.java @@ -29,7 +29,7 @@ public class Folder { private Long id; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id", nullable = false) + @JoinColumn(name = "user_id") private User userId; @Column(nullable = false) diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java index f8d98de..c135082 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderRequestDto.java @@ -13,7 +13,7 @@ @AllArgsConstructor public class FolderRequestDto { - private User userId; + private Long userId; private String folderName; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8a714b6..118fdca 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -22,8 +22,23 @@ spring.cloud.gcp.storage.project-id=heroic-habitat-376713 spring.cloud.gcp.storage.bucket=leturn-file-bucket #db -#spring.datasource.driver-class-name= -#spring.datasource.url= -#spring.datasource.username= +#spring.datasource.url=jdbc:mysql://localhost:3306/HighLight?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true +#spring.datasource.username=root #spring.datasource.password= +#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver + +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= + + + +# google login +google.auth.url=https://oauth2.googleapis.com/ +google.login.url=https://accounts.google.com/ +google.redirect.uri=http://localhost:8080/google/login/redirect +google.client.id=907385257015-gp3hqfll9khmcgm6lv3re3u5htqohuhr.apps.googleusercontent.com +google.secret=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 +google.auth.scope=profile,email,openid From b95d06d42cf26bfd2b92a58c3288018102d44ce3 Mon Sep 17 00:00:00 2001 From: gdakate Date: Sun, 26 Mar 2023 09:52:57 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[feat=20&=20refactor]=20=ED=8A=B9=EC=A0=95?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=20=EC=A1=B0=ED=9A=8C=20API=20with=20h2=20suc?= =?UTF-8?q?cess=20#29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HighLight/Folder/FolderController.java | 10 ++++++---- .../HighLight/Folder/FolderService.java | 9 ++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java index ec9d865..bd86be2 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java @@ -2,6 +2,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,8 +30,9 @@ private ApiResponse createFolder(@RequestBody FolderRequestDto folderRequestDto) return ApiResponse.successCode(Success.GET_FOLDER_SUCCESS,response); } - // @GetMapping("/folder") - // private Folder getFolder(){ - // return folderService.getFolder(); - // } + @GetMapping("/folder/{folder_id}") + private ApiResponse getOneFolder(@PathVariable Long folder_id){ + FolderResponseDto response = folderService.viewOneFolder(folder_id); + return ApiResponse.successCode(Success.GET_FOLDER_SUCCESS,response); + } } diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java index 61dee27..97b523a 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java @@ -2,6 +2,7 @@ import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; @@ -63,6 +64,12 @@ public FolderViewResponseDto viewFolder() { return FolderViewResponseDto.of(folderNames); } + public FolderResponseDto viewOneFolder(Long folder_id) { + Optional folder = folderRepository.findById(folder_id); + if(folder.isPresent()){ + String folderName = folder.get().getName(); + } + return FolderResponseDto.from(folder_id,folder.get().getName()); - + } } From 0bbc42f9a3556290d61793916f88b1c62d02901b Mon Sep 17 00:00:00 2001 From: gdakate Date: Mon, 27 Mar 2023 11:33:31 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[feat=20&=20refactor]=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20=EA=B0=9D=EC=B2=B4=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20API=20with=20h2=20success=20#29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HighLight/Folder/FolderController.java | 8 ++++---- .../HighLight/Folder/FolderResponseDto.java | 13 ++++++++----- .../HighLight/Folder/FolderService.java | 11 ++++++----- .../HighLight/Folder/FolderViewResponseDto.java | 5 ++++- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java index bd86be2..b3ac378 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java @@ -1,11 +1,11 @@ package com.SollutionChallenge.HighLight.Folder; -import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; + import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; 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 com.SollutionChallenge.HighLight.common.ApiResponse; @@ -25,8 +25,8 @@ private ApiResponse createFolder(@RequestBody FolderRequestDto folderRequestDto) } @GetMapping("/folder") - private ApiResponse getFolder(){ - FolderViewResponseDto response = folderService.viewFolder(); + private ApiResponse> getFolder(){ + List response = folderService.viewFolder(); return ApiResponse.successCode(Success.GET_FOLDER_SUCCESS,response); } diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java index 30b34e1..625acf7 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java @@ -1,9 +1,5 @@ package com.SollutionChallenge.HighLight.Folder; -import java.util.List; - -import com.SollutionChallenge.HighLight.User.User; - import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -14,11 +10,18 @@ public class FolderResponseDto { private Long id; private String folderName; + public FolderResponseDto(Long id, String folderName) { + this.id = id; + this.folderName = folderName; + } + public static FolderResponseDto from(Long id, String folderName){ - FolderResponseDto folderResponseDto = new FolderResponseDto(); + FolderResponseDto folderResponseDto = new FolderResponseDto(id, folderName); folderResponseDto.id = id; folderResponseDto.folderName = folderName; return folderResponseDto; } + + } diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java index 8b472b0..46fcdef 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java @@ -1,5 +1,6 @@ package com.SollutionChallenge.HighLight.Folder; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -52,16 +53,16 @@ public FolderResponseDto save(FolderRequestDto folderRequestDto) { } - public FolderViewResponseDto viewFolder() { + public List viewFolder() { List folders = folderRepository.findAll(); - List folderNames = Collections.emptyList(); + List folderResponseDtos =new ArrayList<>(); if (folders != null && !folders.isEmpty()) { - folderNames = folders.stream() + folderResponseDtos = folders.stream() .filter(f -> f.getName() != null) - .map(Folder::getName) + .map(f-> new FolderResponseDto(f.getId(),f.getName())) .collect(Collectors.toList()); } - return FolderViewResponseDto.of(folderNames); + return folderResponseDtos; } public FolderResponseDto viewOneFolder(Long folder_id) { diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java index 1a0729e..2bf2b8e 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderViewResponseDto.java @@ -9,11 +9,14 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class FolderViewResponseDto { + private List id; private List folderName; - public static FolderViewResponseDto of(ListfolderName){ + public static FolderViewResponseDto of(List id,ListfolderName){ FolderViewResponseDto folderViewResponseDto = new FolderViewResponseDto(); + folderViewResponseDto.id= id; folderViewResponseDto.folderName = folderName; + return folderViewResponseDto; } } From 71135dca4572943eaaa09277e2f8df47bcd59472 Mon Sep 17 00:00:00 2001 From: gdakate Date: Mon, 27 Mar 2023 12:01:56 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[refactor]=20=ED=8F=B4=EB=8D=94=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=8B=9C=20=EA=B0=9D=EC=B2=B4=20=EB=B0=98=ED=99=98=20?= =?UTF-8?q?API=20with=20h2=20success=20#29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HighLight/Folder/FolderController.java | 5 ++-- .../Folder/FolderListResponseDto.java | 18 +++++++++++++ .../HighLight/Folder/FolderResponseDto.java | 1 - .../HighLight/Folder/FolderService.java | 25 +++++++++++++++---- 4 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/SollutionChallenge/HighLight/Folder/FolderListResponseDto.java diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java index b3ac378..3d0f76c 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderController.java @@ -1,6 +1,7 @@ package com.SollutionChallenge.HighLight.Folder; import java.util.List; +import java.util.Map; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -25,8 +26,8 @@ private ApiResponse createFolder(@RequestBody FolderRequestDto folderRequestDto) } @GetMapping("/folder") - private ApiResponse> getFolder(){ - List response = folderService.viewFolder(); + private ApiResponse>> getFolder(){ + Map> response = folderService.viewFolder(); return ApiResponse.successCode(Success.GET_FOLDER_SUCCESS,response); } diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderListResponseDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderListResponseDto.java new file mode 100644 index 0000000..1ae784f --- /dev/null +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderListResponseDto.java @@ -0,0 +1,18 @@ +package com.SollutionChallenge.HighLight.Folder; + +import java.util.List; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class FolderListResponseDto { + private List folderList; + + public FolderListResponseDto(List folderList) { + this.folderList = folderList; + } +} diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java index 625acf7..a0b53b3 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderResponseDto.java @@ -24,4 +24,3 @@ public static FolderResponseDto from(Long id, String folderName){ } - diff --git a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java index 46fcdef..67bb1bd 100644 --- a/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java +++ b/src/main/java/com/SollutionChallenge/HighLight/Folder/FolderService.java @@ -2,7 +2,9 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -51,20 +53,33 @@ public FolderResponseDto save(FolderRequestDto folderRequestDto) { Folder savedFolder = folderRepository.save(Folder.createFolder(userId, folderName)); return FolderResponseDto.from(savedFolder.getId(), savedFolder.getName()); } - - - public List viewFolder() { + public Map> viewFolder() { List folders = folderRepository.findAll(); - List folderResponseDtos =new ArrayList<>(); + List folderResponseDtos = new ArrayList<>(); if (folders != null && !folders.isEmpty()) { folderResponseDtos = folders.stream() .filter(f -> f.getName() != null) .map(f-> new FolderResponseDto(f.getId(),f.getName())) .collect(Collectors.toList()); } - return folderResponseDtos; + + Map> response = new HashMap<>(); + response.put("folder", folderResponseDtos); + return response; } + // public List viewFolder() { + // List folders = folderRepository.findAll(); + // List folderResponseDtos =new ArrayList<>(); + // if (folders != null && !folders.isEmpty()) { + // folderResponseDtos = folders.stream() + // .filter(f -> f.getName() != null) + // .map(f-> new FolderResponseDto(f.getId(),f.getName())) + // .collect(Collectors.toList()); + // } + // return folderResponseDtos; + // } + public FolderResponseDto viewOneFolder(Long folder_id) { Optional folder = folderRepository.findById(folder_id); if(folder.isPresent()){