Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

quiz / logout bug fix #15

Merged
merged 14 commits into from
Mar 18, 2024
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
package com.beotkkot.qtudy.controller.auth;

import com.beotkkot.qtudy.domain.user.Users;
import com.beotkkot.qtudy.dto.auth.KakaoUserInfo;
import com.beotkkot.qtudy.dto.auth.UserResponse;
import com.beotkkot.qtudy.dto.object.KakaoUserInfo;
import com.beotkkot.qtudy.dto.response.auth.AuthResponseDto;
import com.beotkkot.qtudy.dto.response.auth.GetAuthResponseDto;
import com.beotkkot.qtudy.service.auth.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/auth/kakao")
@RequiredArgsConstructor
Expand All @@ -21,48 +18,39 @@ public class AuthController {

// 프론트로부터 인가 code를 받아와 카카오 서버로부터 토큰 얻기
@GetMapping("")
public ResponseEntity<Object> kakaoLogin(@RequestParam("code") String code) {
public ResponseEntity<? super GetAuthResponseDto> kakaoLogin(@RequestParam("code") String code) {

System.out.println("code = " + code);

// 1. 인가 코드를 통해 카카오 서버로부터 토큰을 얻는다
String accessToken = authService.getAccessToken(code);
if (accessToken.equals("")) {
return GetAuthResponseDto.noAuthentication();
}

// 2. 발급받은 토큰을 이용해 사용자 정보를 조회
KakaoUserInfo kakaoUserInfo = authService.getKakaoUserInfo(accessToken);

// 3. 로그인
Users user = authService.login(kakaoUserInfo);

// 4. 유저 정보 리턴
UserResponse userResponse = new UserResponse(
"SU",
"Sucess",
user.getUserId(),
user.getKakaoId(),
user.getName(),
user.getProfileImageUrl(),
accessToken
);
return ResponseEntity.status(HttpStatus.OK).body(userResponse);
if (kakaoUserInfo == null) {
return GetAuthResponseDto.noExistUser();

} else {
// 3. 로그인
Users user = authService.login(kakaoUserInfo);
// 4. 유저 정보 리턴
return GetAuthResponseDto.success(user, accessToken);
}
}

@PostMapping("/logout")
public ResponseEntity<Map<String,String>> logout(@RequestHeader("Authorization") String header) {

System.out.println("header = " + header);
public ResponseEntity<? super AuthResponseDto> logout(@RequestHeader("Authorization") String accessToken) {

String[] authHeader = header.split(" ");
// 헤더에서 토큰 추출
String accessToken = authHeader[1];
System.out.println("accessToken = " + accessToken);

// 토큰을 사용해 로그아웃 처리
authService.logout(accessToken);
ResponseEntity<? super AuthResponseDto> response = authService.logout(accessToken);

// 로그아웃 성공 메시지 반환
Map<String, String> response = new HashMap<>();
response.put("code", "SU");
response.put("message", "Success");
return ResponseEntity.ok(response);
// 로그아웃 응답 반환
return response;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.beotkkot.qtudy.controller.quiz;

import com.beotkkot.qtudy.dto.request.quiz.GenerateQuizRequestDto;
import com.beotkkot.qtudy.dto.request.quiz.GradeQuizRequestDto;
import com.beotkkot.qtudy.dto.response.quiz.GetPostQuizResponseDto;
import com.beotkkot.qtudy.dto.response.quiz.QuizGradeResponseDto;
import com.beotkkot.qtudy.service.quiz.QuizService;
import com.fasterxml.jackson.core.JsonProcessingException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.HttpClientErrorException;

@RequiredArgsConstructor
@RestController
@Slf4j
public class QuizController {

private final QuizService quizService;

// 퀴즈 생성 및 저장
@PostMapping("/quiz")
public ResponseEntity<?> generateQuiz(@RequestBody GenerateQuizRequestDto dto) {
try {
return ResponseEntity.ok().body(quizService.generateQuiz(dto));
} catch (HttpClientErrorException | JsonProcessingException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}

// 태그별 퀴즈 출력
@GetMapping("/quiz/tag-quiz/{tagName}")
public ResponseEntity<? super GetPostQuizResponseDto> getTagQuiz(@PathVariable String tagName) {
ResponseEntity<? super GetPostQuizResponseDto> response = quizService.getTagQuiz(tagName);
return response;
}

// 게시글 별 퀴즈 출력
@GetMapping("/quiz/post-quiz/{postId}")
public ResponseEntity<? super GetPostQuizResponseDto> getPostQuiz(@PathVariable Long postId) {
ResponseEntity<? super GetPostQuizResponseDto> response = quizService.getPostQuiz(postId);
return response;
}

// 정답 채점
@PostMapping("/quiz/grade")
public ResponseEntity<? super QuizGradeResponseDto> gradeQuiz(@RequestBody GradeQuizRequestDto dto) {
ResponseEntity<? super QuizGradeResponseDto> response = quizService.gradeQuiz(dto);
return response;
}
}
34 changes: 34 additions & 0 deletions src/main/java/com/beotkkot/qtudy/domain/quiz/Quiz.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.beotkkot.qtudy.domain.quiz;

import jakarta.persistence.*;
import lombok.*;

@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Quiz {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long quizId;

@Column(nullable = false)
private Long postId;

@Column(nullable = false, columnDefinition = "TEXT")
private String tags;

@Column(nullable = false, columnDefinition = "TEXT")
private String question;

@Column(/*nullable = false,*/ columnDefinition = "TEXT")
private String answer;

@Column(/*nullable = false,*/ columnDefinition = "TEXT")
private String explanation;

@Column(nullable = false, columnDefinition = "TEXT")
private String options;
}
18 changes: 0 additions & 18 deletions src/main/java/com/beotkkot/qtudy/dto/auth/UserResponse.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.beotkkot.qtudy.dto.auth;
package com.beotkkot.qtudy.dto.object;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/com/beotkkot/qtudy/dto/object/QuizDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.beotkkot.qtudy.dto.object;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class QuizDto {
private String question;
private String answer;
private List<String> options;
private String explanation;
}
41 changes: 41 additions & 0 deletions src/main/java/com/beotkkot/qtudy/dto/object/QuizGradeListItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.beotkkot.qtudy.dto.object;

import com.beotkkot.qtudy.domain.quiz.Quiz;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.List;

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class QuizGradeListItem {
private Long quizId;
private List<String> tags;
private String question;
private String answer;
private boolean correct;
private int userAnswer;
private List<String> options;
private String explanation;

public static QuizGradeListItem of(Quiz quiz, boolean correct, int userAnswer) {
List<String> tags = Arrays.asList(quiz.getTags().split("\\s*,\\s*"));
List<String> options = Arrays.asList(quiz.getOptions().split("\\s*,\\s*"));

return QuizGradeListItem.builder()
.quizId(quiz.getQuizId())
.tags(tags)
.question(quiz.getQuestion())
.answer(quiz.getAnswer())
.correct(correct)
.userAnswer(userAnswer)
.options(options)
.explanation(quiz.getExplanation())
.build();
}
}
37 changes: 37 additions & 0 deletions src/main/java/com/beotkkot/qtudy/dto/object/QuizListItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.beotkkot.qtudy.dto.object;

import com.beotkkot.qtudy.domain.quiz.Quiz;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Arrays;
import java.util.List;

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class QuizListItem {
private Long quizId;
private List<String> tags;
private String question;
private String answer;
private List<String> options;
private String explanation;

public static QuizListItem of(Quiz quiz) {
List<String> tags = Arrays.asList(quiz.getTags().split("\\s*,\\s*"));
List<String> options = Arrays.asList(quiz.getOptions().split("\\s*,\\s*"));

return QuizListItem.builder()
.quizId(quiz.getQuizId())
.tags(tags)
.question(quiz.getQuestion())
.answer(quiz.getAnswer())
.options(options)
.explanation(quiz.getExplanation())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.beotkkot.qtudy.dto.request.quiz;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ChatMessageRequestDto {
private String role;
private String content;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.beotkkot.qtudy.dto.request.quiz;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GenerateQuizRequestDto {
private Long postId;
private String tags;
private String summary;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.beotkkot.qtudy.dto.request.quiz;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class GradeQuizRequestDto {
private List<Long> quizIdList;
private List<String> answerList;
private List<Integer> userAnswerList;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.beotkkot.qtudy.dto.request.quiz;

import com.beotkkot.qtudy.dto.object.QuizDto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class PostQuizRequestDto {
private Long postId;
private String tags;
private QuizDto quizDto;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.beotkkot.qtudy.dto.response.auth;

import com.beotkkot.qtudy.common.ResponseCode;
import com.beotkkot.qtudy.common.ResponseMessage;
import com.beotkkot.qtudy.dto.response.ResponseDto;
import lombok.Getter;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

@Getter
public class AuthResponseDto extends ResponseDto {
private AuthResponseDto() {
super(ResponseCode.SUCCESS, ResponseMessage.SUCCESS);
}

public static ResponseEntity<AuthResponseDto> success() {
AuthResponseDto result = new AuthResponseDto();
return ResponseEntity.status(HttpStatus.OK).body(result);
}

public static ResponseEntity<ResponseDto> notExistUser() {
ResponseDto result = new ResponseDto(ResponseCode.NOT_EXISTED_USER, ResponseMessage.NOT_EXISTED_USER);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(result);
}

public static ResponseEntity<ResponseDto> noAuthentication() {
ResponseDto result = new ResponseDto(ResponseCode.AUTHORIZATION_FAIL, ResponseMessage.AUTHORIZATION_FAIL);
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(result);
}
}
Loading