Skip to content

Commit

Permalink
Merge pull request #36 from DigiLabChallengeHackathon/fix/api
Browse files Browse the repository at this point in the history
release
  • Loading branch information
andrewkimswe authored Jan 3, 2025
2 parents 6e8cd63 + 1cf2cbb commit f6e81e9
Show file tree
Hide file tree
Showing 11 changed files with 152 additions and 253 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,61 +2,42 @@

import java.util.Optional;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import com.mosabulgyeo.bewavoca.dto.ApiResponse;
import com.mosabulgyeo.bewavoca.dto.DeviceRequest;
import com.mosabulgyeo.bewavoca.dto.SignupRequest;
import com.mosabulgyeo.bewavoca.dto.UpdateNicknameRequest;
import com.mosabulgyeo.bewavoca.dto.UserResponse;
import com.mosabulgyeo.bewavoca.dto.*;
import com.mosabulgyeo.bewavoca.entity.User;
import com.mosabulgyeo.bewavoca.service.AuthService;

import jakarta.validation.Valid;

/**
* 사용자 인증 REST 컨트롤러
* 회원가입 및 로그인 엔드포인트 제공
*/
@RestController
@RequestMapping("/api/auth")
public class AuthController {

private final AuthService authService;

/**
* 생성자 의존성 주입
*
* @param authService 사용자 인증 서비스
*/
public AuthController(AuthService authService) {
this.authService = authService;
}

/**
* 기기 존재 여부 확인 엔드포인트
*
* 클라이언트에서 제공한 기기 ID를 사용하여 사용자의 존재 여부를 확인합니다.
* 사용자가 존재할 경우 사용자 정보를 반환하며, 존재하지 않을 경우 상태와 메시지를 반환합니다.
*
* @param request 기기 ID를 포함한 요청 데이터
* @return 사용자 정보 또는 상태 메시지를 포함한 ResponseEntity
* 기기 존재 여부 확인
* @param request 기기 ID
* @return 사용자 정보 또는 상태 메시지
*/
@PostMapping("/check-device")
public ResponseEntity<ApiResponse<UserResponse>> checkDevice(@RequestBody @Valid DeviceRequest request) {
Optional<User> user = authService.findUserByDeviceId(request.getDeviceId());

if (user.isPresent()) {
// 사용자가 존재하는 경우 성공 응답 반환
return ResponseEntity.ok(new ApiResponse<>(
"success",
"User exists",
new UserResponse(user.get().getId(), user.get().getNickname())
));
}

// 사용자가 없는 경우 실패 상태와 함께 데이터가 null인 응답 반환
return ResponseEntity.ok(new ApiResponse<>(
"fail",
"User does not exist",
Expand All @@ -65,13 +46,9 @@ public ResponseEntity<ApiResponse<UserResponse>> checkDevice(@RequestBody @Valid
}

/**
* 회원가입 처리 엔드포인트
*
* 클라이언트에서 제공한 기기 ID와 닉네임을 사용하여 새로운 사용자를 등록합니다.
* 등록이 완료되면 사용자 정보를 반환합니다.
*
* @param request 기기 ID와 닉네임을 포함한 요청 데이터
* @return 등록된 사용자 정보를 포함한 ResponseEntity
* 회원가입 처리
* @param request 회원가입 요청 데이터
* @return 등록된 사용자 정보
*/
@PostMapping("/signup")
public ResponseEntity<ApiResponse<UserResponse>> signup(@RequestBody @Valid SignupRequest request) {
Expand All @@ -84,47 +61,42 @@ public ResponseEntity<ApiResponse<UserResponse>> signup(@RequestBody @Valid Sign
}

/**
* 기기번호로 사용자 정보 조회 엔드포인트
*
* 제공된 기기 ID로 사용자 정보 검색
* HTTP 200 OK 응답과 함께 사용자 정보 반환
*
* @param deviceId 조회할 기기 고유 식별자
* @return 사용자 정보를 포함한 ResponseEntity
* 스테이지 클리어 처리
* @param request 스테이지 클리어 요청 데이터
* @return 처리 상태 메시지
*/
@GetMapping("/user/{deviceId}")
public ResponseEntity<ApiResponse<UserResponse>> getUserInfo(@PathVariable String deviceId) {
User user = authService.getUserByDeviceId(deviceId);
if (user == null) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ApiResponse<>(
"fail",
"User not found",
null
));
}
@PostMapping("/clear-stage")
public ResponseEntity<ApiResponse<Void>> clearStage(@RequestBody @Valid StageClearRequest request) {
authService.clearStage(request.getDeviceId(), request.getRegion(), request.getStage());
return ResponseEntity.ok(new ApiResponse<>(
"success",
"User information retrieved",
new UserResponse(user.getId(), user.getNickname())
"Stage cleared successfully",
null
));
}

/**
* 사용자 진행 상황 조회
* @param deviceId 사용자 기기 ID
* @return 진행 상황 데이터
*/
@GetMapping("/progress/{deviceId}")
public ResponseEntity<ApiResponse<UserProgressResponse>> getProgress(@PathVariable String deviceId) {
UserProgressResponse progress = authService.getProgress(deviceId);
return ResponseEntity.ok(new ApiResponse<>(
"success",
"Progress retrieved successfully",
progress
));
}

/**
* 닉네임 업데이트 엔드포인트
* 닉네임 업데이트
* @param request 닉네임 업데이트 요청 데이터
* @return 업데이트된 사용자 정보
*/
@PatchMapping("/nickname")
public ResponseEntity<ApiResponse<UserResponse>> updateNickname(@RequestBody @Valid UpdateNicknameRequest request) {
if (request.getNewNickname() == null || request.getNewNickname().isEmpty()) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(new ApiResponse<>(
"fail",
"Nickname cannot be empty",
null
));
}
User updatedUser = authService.updateNickname(request.getDeviceId(), request.getNewNickname());
return ResponseEntity.ok(new ApiResponse<>(
"success",
Expand Down
14 changes: 1 addition & 13 deletions src/main/java/com/mosabulgyeo/bewavoca/dto/QuizResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,6 @@ public static class OXQuiz {
*/
@NotBlank(message = "Explanation is required.")
private String explanation;

/**
* OX 퀴즈의 음성 파일 경로.
*/
@NotBlank(message = "Voice file path is required.")
private String voice;
}

/**
Expand Down Expand Up @@ -122,7 +116,7 @@ public static class ChoiceQuiz {
* 예: ["바나나", "사과", "키위", "포도"]
*/
@NotNull(message = "Options are required.")
private String[] options;
private List<String> options;

/**
* 정답 제주어 단어.
Expand All @@ -136,11 +130,5 @@ public static class ChoiceQuiz {
* 예: "바나나는 제주어로 A입니다."
*/
private String explanation;

/**
* 음성 파일 경로.
* 예: "link_to_voice_file"
*/
private String voice;
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/mosabulgyeo/bewavoca/dto/StageClearRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.mosabulgyeo.bewavoca.dto;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class StageClearRequest {
private String deviceId; // 사용자 ID
private int region; // 지역 번호
private int stage; // 스테이지 번호
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ public class UpdateNicknameRequest {

/**
* 새로운 닉네임
* 닉네임은 최대 8자까지 허용하며 필수 입력
* 닉네임은 최대 5자까지 허용하며 필수 입력
*/
@NotBlank(message = "New nickname is required.")
@Size(max = 8, message = "Nickname cannot exceed 8 characters.")
@Size(max = 5, message = "Nickname cannot exceed 5 characters.")
@Pattern(regexp = "^[a-zA-Z가-힣0-9]*$", message = "Nickname can only contain letters, numbers, and Korean characters.")
private String newNickname;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.mosabulgyeo.bewavoca.dto;

import java.util.Set;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class UserProgressResponse {
private Set<String> clearedStages; // 클리어한 스테이지 목록
private Set<Integer> clearedRegions; // 클리어한 지역 목록

public UserProgressResponse(Set<String> clearedStages, Set<Integer> clearedRegions) {
this.clearedStages = clearedStages;
this.clearedRegions = clearedRegions;
}
}
18 changes: 7 additions & 11 deletions src/main/java/com/mosabulgyeo/bewavoca/entity/Quiz.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.mosabulgyeo.bewavoca.entity;

import java.util.List;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand Down Expand Up @@ -53,21 +55,17 @@ public class Quiz {
* 4지선다 선택지 (쉼표로 구분된 문자열)
* 예: "바나나,사과,키위,포도"
*/
@Column(nullable = true)
private String options;
@ElementCollection
@CollectionTable(name = "quiz_options", joinColumns = @JoinColumn(name = "quiz_id"))
@Column(name = "option_value")
private List<String> options;

/**
* 정답 설명
*/
@Column(nullable = true)
private String explanation;

/**
* 음성 파일 경로
*/
@Column(nullable = true)
private String voice;

/**
* OX 유형의 정답 (true: O, false: X)
*/
Expand All @@ -83,19 +81,17 @@ public class Quiz {
* @param jeju 제주어 (정답)
* @param options 선택지 (쉼표로 구분된 문자열)
* @param explanation 정답 설명
* @param voice 음성 파일 경로
* @param correctAnswer OX 정답
*/
public Quiz(Region region, String stageType, String question, String standard, String jeju,
String options, String explanation, String voice, Boolean correctAnswer) {
List<String> options, String explanation, Boolean correctAnswer) {
this.region = region;
this.stageType = stageType;
this.question = question;
this.standard = standard;
this.jeju = jeju;
this.options = options;
this.explanation = explanation;
this.voice = voice;
this.correctAnswer = correctAnswer;
}
}
Loading

0 comments on commit f6e81e9

Please sign in to comment.