From 5f89a3fca8f6c7e677ad815d24343c6e8d66ffdf Mon Sep 17 00:00:00 2001 From: wlgns12370 Date: Sun, 13 Jul 2025 15:18:36 +0900 Subject: [PATCH 1/4] =?UTF-8?q?MOSU-88=20feat:=20LoginId=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20Controller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/user/UserController.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/life/mosu/mosuserver/presentation/user/UserController.java b/src/main/java/life/mosu/mosuserver/presentation/user/UserController.java index 75af5568..4249d48d 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/user/UserController.java +++ b/src/main/java/life/mosu/mosuserver/presentation/user/UserController.java @@ -2,6 +2,8 @@ import life.mosu.mosuserver.application.user.UserService; import life.mosu.mosuserver.global.util.ApiResponseWrapper; +import life.mosu.mosuserver.presentation.user.dto.CustomerKeyResponse; +import life.mosu.mosuserver.presentation.user.dto.IsLoginIdAvailableResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -13,7 +15,7 @@ @RestController @RequestMapping("/user") @RequiredArgsConstructor -public class UserController { +public class UserController implements UserControllerDocs { private final UserService userService; @@ -27,4 +29,15 @@ public ResponseEntity> getCustomerKey( CustomerKeyResponse.from(customerKey))); } + @GetMapping("/check-id") + public ResponseEntity> isLoginIdAvailable( + @RequestParam String loginId + ) { + Boolean isLoginIdAvailable = userService.isLoginIdAvailable(loginId); + + return ResponseEntity.ok( + ApiResponseWrapper.success(HttpStatus.OK, "User Login ID 등록 가능 여부 조회 성공", + IsLoginIdAvailableResponse.from(isLoginIdAvailable))); + } + } From 35d72ed900767313f29a4728b8b9f14de242eaf9 Mon Sep 17 00:00:00 2001 From: wlgns12370 Date: Sun, 13 Jul 2025 15:18:42 +0900 Subject: [PATCH 2/4] =?UTF-8?q?MOSU-88=20feat:=20LoginId=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20Service=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../life/mosu/mosuserver/application/user/UserService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/life/mosu/mosuserver/application/user/UserService.java b/src/main/java/life/mosu/mosuserver/application/user/UserService.java index 11750587..aade8626 100644 --- a/src/main/java/life/mosu/mosuserver/application/user/UserService.java +++ b/src/main/java/life/mosu/mosuserver/application/user/UserService.java @@ -19,4 +19,7 @@ public String getCustomerKey(Long userId) { .orElseThrow(() -> new CustomRuntimeException(ErrorCode.USER_NOT_FOUND)); } + public boolean isLoginIdAvailable(String loginId) { + return !userJpaRepository.existsByLoginId(loginId); + } } From 8f6244ac17d90e49875442236d93e7769ff32450 Mon Sep 17 00:00:00 2001 From: wlgns12370 Date: Sun, 13 Jul 2025 15:19:22 +0900 Subject: [PATCH 3/4] =?UTF-8?q?MOSU-88=20feat:=20LoginId=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20Response=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/{ => dto}/CustomerKeyResponse.java | 2 +- .../user/dto/IsLoginIdAvailableResponse.java | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) rename src/main/java/life/mosu/mosuserver/presentation/user/{ => dto}/CustomerKeyResponse.java (78%) create mode 100644 src/main/java/life/mosu/mosuserver/presentation/user/dto/IsLoginIdAvailableResponse.java diff --git a/src/main/java/life/mosu/mosuserver/presentation/user/CustomerKeyResponse.java b/src/main/java/life/mosu/mosuserver/presentation/user/dto/CustomerKeyResponse.java similarity index 78% rename from src/main/java/life/mosu/mosuserver/presentation/user/CustomerKeyResponse.java rename to src/main/java/life/mosu/mosuserver/presentation/user/dto/CustomerKeyResponse.java index 129fcd42..b63fecce 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/user/CustomerKeyResponse.java +++ b/src/main/java/life/mosu/mosuserver/presentation/user/dto/CustomerKeyResponse.java @@ -1,4 +1,4 @@ -package life.mosu.mosuserver.presentation.user; +package life.mosu.mosuserver.presentation.user.dto; public record CustomerKeyResponse( String customerKey diff --git a/src/main/java/life/mosu/mosuserver/presentation/user/dto/IsLoginIdAvailableResponse.java b/src/main/java/life/mosu/mosuserver/presentation/user/dto/IsLoginIdAvailableResponse.java new file mode 100644 index 00000000..6fdf3250 --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/presentation/user/dto/IsLoginIdAvailableResponse.java @@ -0,0 +1,10 @@ +package life.mosu.mosuserver.presentation.user.dto; + +public record IsLoginIdAvailableResponse( + Boolean isLoginIdAvailable +) { + + public static IsLoginIdAvailableResponse from(Boolean isLoginIdAvailable) { + return new IsLoginIdAvailableResponse(isLoginIdAvailable); + } +} \ No newline at end of file From 95ddb17bfafe6401e3bf7ca366138669aa9e766a Mon Sep 17 00:00:00 2001 From: wlgns12370 Date: Sun, 13 Jul 2025 15:25:11 +0900 Subject: [PATCH 4/4] =?UTF-8?q?MOSU-88=20docs:=20LoginId=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20Swagger=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/school/SchoolController.java | 2 +- .../school/SchoolControllerDocs.java | 35 ++++++++++++++++ .../presentation/user/UserControllerDocs.java | 41 +++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/main/java/life/mosu/mosuserver/presentation/school/SchoolControllerDocs.java create mode 100644 src/main/java/life/mosu/mosuserver/presentation/user/UserControllerDocs.java diff --git a/src/main/java/life/mosu/mosuserver/presentation/school/SchoolController.java b/src/main/java/life/mosu/mosuserver/presentation/school/SchoolController.java index 2de6231d..90634930 100644 --- a/src/main/java/life/mosu/mosuserver/presentation/school/SchoolController.java +++ b/src/main/java/life/mosu/mosuserver/presentation/school/SchoolController.java @@ -17,7 +17,7 @@ @RestController @RequestMapping("/school") @RequiredArgsConstructor -public class SchoolController { +public class SchoolController implements SchoolControllerDocs { private final SchoolService schoolService; diff --git a/src/main/java/life/mosu/mosuserver/presentation/school/SchoolControllerDocs.java b/src/main/java/life/mosu/mosuserver/presentation/school/SchoolControllerDocs.java new file mode 100644 index 00000000..10c5ed9f --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/presentation/school/SchoolControllerDocs.java @@ -0,0 +1,35 @@ +package life.mosu.mosuserver.presentation.school; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import life.mosu.mosuserver.global.util.ApiResponseWrapper; +import life.mosu.mosuserver.presentation.school.dto.SchoolRegistrationRequest; +import life.mosu.mosuserver.presentation.school.dto.SchoolResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestBody; + +@Tag(name = "School", description = "학교 정보 관련 API") +public interface SchoolControllerDocs { + + @Operation(summary = "[관리자] 학교 정보 등록", description = "새로운 학교 정보를 시스템에 등록합니다. 인가 추가 예정") + @ApiResponses(value = { + @ApiResponse(responseCode = "201", description = "학교 등록 성공"), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터"), + @ApiResponse(responseCode = "409", description = "이미 존재하는 학교 정보") + }) + ResponseEntity> create(@RequestBody SchoolRegistrationRequest request); + + @Operation(summary = "[사용자] 전체 학교 목록 조회", description = "시스템에 등록된 모든 학교 목록을 조회합니다. 인가 추가 예정") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "학교 목록 조회 성공", + content = @Content(array = @ArraySchema(schema = @Schema(implementation = SchoolResponse.class)))), + @ApiResponse(responseCode = "500", description = "서버 내부 오류") + }) + ResponseEntity>> getSchools(); +} \ No newline at end of file diff --git a/src/main/java/life/mosu/mosuserver/presentation/user/UserControllerDocs.java b/src/main/java/life/mosu/mosuserver/presentation/user/UserControllerDocs.java new file mode 100644 index 00000000..e478df1c --- /dev/null +++ b/src/main/java/life/mosu/mosuserver/presentation/user/UserControllerDocs.java @@ -0,0 +1,41 @@ +package life.mosu.mosuserver.presentation.user; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import life.mosu.mosuserver.global.util.ApiResponseWrapper; +import life.mosu.mosuserver.presentation.user.dto.CustomerKeyResponse; +import life.mosu.mosuserver.presentation.user.dto.IsLoginIdAvailableResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestParam; + +@Tag(name = "User", description = "사용자 관련 API") +public interface UserControllerDocs { + + @Operation(summary = "고객 키 조회", description = "사용자 ID를 이용해 결제에 사용될 고객 키(Customer Key)를 조회합니다.") + @Parameter(name = "userId", description = "조회할 사용자의 고유 ID", required = true, example = "1") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "고객 키 조회 성공", + content = @Content(schema = @Schema(implementation = CustomerKeyResponse.class))), + @ApiResponse(responseCode = "404", description = "사용자를 찾을 수 없음"), + @ApiResponse(responseCode = "500", description = "서버 내부 오류") + }) + public ResponseEntity> getCustomerKey( + @RequestParam Long userId + ); + + @Operation(summary = "로그인 ID 중복 확인", description = "회원가입 시 사용할 로그인 ID의 중복 여부를 확인합니다.") + @Parameter(name = "loginId", description = "중복 확인할 로그인 ID", required = true, example = "mosu123") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "ID 사용 가능 여부 조회 성공 (true: 사용 가능, false: 중복)"), + @ApiResponse(responseCode = "400", description = "잘못된 요청"), + @ApiResponse(responseCode = "500", description = "서버 내부 오류") + }) + public ResponseEntity> isLoginIdAvailable( + @RequestParam String loginId + ); +} \ No newline at end of file