Merge branch 'backend' of github.com:TeamBNBN/edufocus into be/Board

This commit is contained in:
yulmam 2024-07-19 12:58:45 +09:00
commit 828df9c91c
14 changed files with 266 additions and 53 deletions

View File

@ -1,8 +1,13 @@
package com.edufocus.edufocus.lecture.controller; package com.edufocus.edufocus.lecture.controller;
import com.edufocus.edufocus.lecture.entity.Lecture; import com.edufocus.edufocus.lecture.entity.LectureCreateRequest;
import com.edufocus.edufocus.lecture.entity.LectureRegist; import com.edufocus.edufocus.lecture.entity.LectureSearchResponse;
import com.edufocus.edufocus.lecture.entity.LectureDetailResponse;
import com.edufocus.edufocus.lecture.service.LectureService; import com.edufocus.edufocus.lecture.service.LectureService;
import com.edufocus.edufocus.user.model.entity.User;
import com.edufocus.edufocus.user.model.service.UserService;
import com.edufocus.edufocus.user.model.service.UserServiceImpl;
import com.edufocus.edufocus.user.util.JWTUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -18,11 +23,14 @@ import java.util.List;
public class LectureController { public class LectureController {
private final LectureService lectureService; private final LectureService lectureService;
private final JWTUtil jwtUtil;
private final UserService userService;
@PostMapping @PostMapping
public ResponseEntity<?> createLecture (@RequestBody long userId, LectureRegist lectureRegist) { public ResponseEntity<?> createLecture(@RequestHeader("Authorization") String accessToken, @RequestBody LectureCreateRequest lectureCreateRequest) {
System.out.println("@@@@@@@@@@@@@@@@@@>>>>>>>>>>>>>>>>>>>>>> "+userId); Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
lectureService.createLecture(userId, lectureRegist);
lectureService.createLecture(userId, lectureCreateRequest);
return new ResponseEntity<>(HttpStatus.CREATED); return new ResponseEntity<>(HttpStatus.CREATED);
} }
@ -37,7 +45,7 @@ public class LectureController {
@GetMapping @GetMapping
public ResponseEntity<?> findAllLecture() { public ResponseEntity<?> findAllLecture() {
List<Lecture> lectures = lectureService.findAllLecture(); List<LectureSearchResponse> lectures = lectureService.findAllLecture();
if (lectures.isEmpty()) { if (lectures.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT); return new ResponseEntity<>(HttpStatus.NO_CONTENT);
@ -46,17 +54,27 @@ public class LectureController {
return new ResponseEntity<>(lectures, HttpStatus.OK); return new ResponseEntity<>(lectures, HttpStatus.OK);
} }
@GetMapping("/title/{title}") @GetMapping("/{lectureId}")
public ResponseEntity<?> findByTitle (@PathVariable String title) { public ResponseEntity<?> findById(@PathVariable long lectureId) {
Lecture lecture = lectureService.findLectureByTitle(title); LectureDetailResponse lectureDetailResponse = lectureService.findLectureById(lectureId);
if (lecture == null) { if (lectureDetailResponse == null) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT); return new ResponseEntity<>(HttpStatus.NO_CONTENT);
} }
return new ResponseEntity<>(lecture, HttpStatus.OK); return new ResponseEntity<>(lectureDetailResponse, HttpStatus.OK);
} }
@GetMapping("/mylecture")
public ResponseEntity<?> findMyLecture(@RequestHeader("Authorization") String accessToken) {
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
List<LectureSearchResponse> myLectures = lectureService.findMyLecture(userId);
if (myLectures.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<>(myLectures, HttpStatus.OK);
}
} }

View File

@ -29,6 +29,9 @@ public class Lecture {
@Lob @Lob
private String description; private String description;
@Column
private String image;
@Column(name = "start_date") @Column(name = "start_date")
@Temporal(TemporalType.DATE) @Temporal(TemporalType.DATE)
private Date startDate; private Date startDate;
@ -43,6 +46,4 @@ public class Lecture {
@Column @Column
private boolean online; private boolean online;
} }

View File

@ -1,6 +1,5 @@
package com.edufocus.edufocus.lecture.entity; package com.edufocus.edufocus.lecture.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -10,18 +9,16 @@ import java.util.Date;
@Getter @Getter
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class LectureRegist { public class LectureCreateRequest {
private Long userId;
private String title; private String title;
private String description; private String description;
@Temporal(TemporalType.DATE) private String image;
private Date startDate; private Date startDate;
@Temporal(TemporalType.DATE)
private Date endDate; private Date endDate;
private String plan; private String plan;

View File

@ -0,0 +1,33 @@
package com.edufocus.edufocus.lecture.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.Date;
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LectureDetailResponse {
private Long id;
private String teacherName;
private String title;
private String description;
private String image;
private Date startDate;
private Date endDate;
private String plan;
private boolean online;
}

View File

@ -0,0 +1,19 @@
package com.edufocus.edufocus.lecture.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LectureSearchResponse {
private Long id;
private String title;
private String image;
}

View File

@ -12,4 +12,6 @@ import java.util.List;
public interface LectureRepository extends JpaRepository<Lecture, Long> { public interface LectureRepository extends JpaRepository<Lecture, Long> {
Lecture findByTitle(@Param("title") String title); Lecture findByTitle(@Param("title") String title);
List<Lecture> findAllByUserId(@Param("userId") Long userId);
} }

View File

@ -1,7 +1,8 @@
package com.edufocus.edufocus.lecture.service; package com.edufocus.edufocus.lecture.service;
import com.edufocus.edufocus.lecture.entity.Lecture; import com.edufocus.edufocus.lecture.entity.LectureCreateRequest;
import com.edufocus.edufocus.lecture.entity.LectureRegist; import com.edufocus.edufocus.lecture.entity.LectureSearchResponse;
import com.edufocus.edufocus.lecture.entity.LectureDetailResponse;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@ -10,12 +11,14 @@ import java.util.List;
@Service @Service
public interface LectureService { public interface LectureService {
void createLecture(long userId, LectureRegist lectureRegist); void createLecture(long userId, LectureCreateRequest lectureCreateRequest);
boolean deleteLecture(long userId, long LectureId); boolean deleteLecture(long userId, long LectureId);
List<Lecture> findAllLecture(); List<LectureSearchResponse> findAllLecture();
Lecture findLectureByTitle(String title); LectureDetailResponse findLectureById(long lectureId);
List<LectureSearchResponse> findMyLecture(long userId);
} }

View File

@ -1,16 +1,23 @@
package com.edufocus.edufocus.lecture.service; package com.edufocus.edufocus.lecture.service;
import com.edufocus.edufocus.lecture.entity.Lecture; import com.edufocus.edufocus.lecture.entity.Lecture;
import com.edufocus.edufocus.lecture.entity.LectureRegist; import com.edufocus.edufocus.lecture.entity.LectureCreateRequest;
import com.edufocus.edufocus.lecture.entity.LectureSearchResponse;
import com.edufocus.edufocus.lecture.entity.LectureDetailResponse;
import com.edufocus.edufocus.lecture.repository.LectureRepository; import com.edufocus.edufocus.lecture.repository.LectureRepository;
import com.edufocus.edufocus.registration.entity.Registration;
import com.edufocus.edufocus.registration.repository.RegistrationRepository;
import com.edufocus.edufocus.user.model.entity.User; import com.edufocus.edufocus.user.model.entity.User;
import com.edufocus.edufocus.user.model.repository.UserRepository; import com.edufocus.edufocus.user.model.repository.UserRepository;
import jakarta.transaction.Transactional; import jakarta.transaction.Transactional;
import lombok.Builder;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Builder
@Service @Service
@Transactional @Transactional
@RequiredArgsConstructor @RequiredArgsConstructor
@ -20,19 +27,22 @@ public class LectureServiceImpl implements LectureService {
private final UserRepository userRepository; private final UserRepository userRepository;
private final RegistrationRepository registrationRepository;
@Override @Override
public void createLecture(long userId, LectureRegist lectureRegist) { public void createLecture(long userId, LectureCreateRequest lectureCreateRequest) {
User user = userRepository.findById(userId).get(); User user = userRepository.findById(userId).get();
Lecture lecture = new Lecture(); Lecture lecture = new Lecture();
lecture.setUser(user); lecture.setUser(user);
lecture.setTitle(lectureRegist.getTitle()); lecture.setTitle(lectureCreateRequest.getTitle());
lecture.setDescription(lectureRegist.getDescription()); lecture.setDescription(lectureCreateRequest.getDescription());
lecture.setStartDate(lectureRegist.getStartDate()); lecture.setImage(lectureCreateRequest.getImage());
lecture.setEndDate(lectureRegist.getEndDate()); lecture.setStartDate(lectureCreateRequest.getStartDate());
lecture.setPlan(lectureRegist.getPlan()); lecture.setEndDate(lectureCreateRequest.getEndDate());
lecture.setPlan(lectureCreateRequest.getPlan());
lectureRepository.save(lecture); lectureRepository.save(lecture);
} }
@ -50,14 +60,78 @@ public class LectureServiceImpl implements LectureService {
} }
@Override @Override
public List<Lecture> findAllLecture() { public List<LectureSearchResponse> findAllLecture() {
return lectureRepository.findAll(); List<Lecture> lectureList = lectureRepository.findAll();
List<LectureSearchResponse> lectureSearchResponseList = new ArrayList<>();
for (Lecture lecture : lectureList) {
LectureSearchResponse lectureSearchResponse = LectureSearchResponse.builder()
.id(lecture.getId())
.title(lecture.getTitle())
.image(lecture.getImage()).build();
lectureSearchResponseList.add(lectureSearchResponse);
}
return lectureSearchResponseList;
} }
@Override @Override
public Lecture findLectureByTitle(String title) { public LectureDetailResponse findLectureById(long lectureId) {
return lectureRepository.findByTitle(title);
Lecture lecture = lectureRepository.findById(lectureId).get();
if (lecture == null) {
return null;
} }
LectureDetailResponse lectureDetailResponse = new LectureDetailResponse().builder()
.id(lecture.getId())
.title(lecture.getTitle())
.description(lecture.getDescription())
.image(lecture.getImage())
.startDate(lecture.getStartDate())
.endDate(lecture.getEndDate())
.plan(lecture.getPlan())
.online(lecture.isOnline())
.teacherName(lecture.getUser().getName())
.build();
return lectureDetailResponse;
}
public List<LectureSearchResponse> findMyLecture(long userId) {
User user = userRepository.findById(userId).get();
List<LectureSearchResponse> myLectureList = new ArrayList<>();
if (user.getRole().equals("ADMIN")) {
List<Lecture> lectureList = lectureRepository.findAllByUserId(userId);
for (Lecture lecture : lectureList) {
LectureSearchResponse lectureSearchResponse = new LectureSearchResponse().builder()
.id(lecture.getId())
.title(lecture.getTitle())
.image(lecture.getImage()).build();
myLectureList.add(lectureSearchResponse);
}
} else {
List<Registration> registrationList = registrationRepository.findAllByUserId(userId);
for (Registration registration : registrationList) {
Lecture lecture = registration.getLecture();
LectureSearchResponse lectureSearchResponse = new LectureSearchResponse().builder()
.id(lecture.getId())
.title(lecture.getTitle())
.image(lecture.getImage()).build();
myLectureList.add(lectureSearchResponse);
}
}
return myLectureList;
}
} }

View File

@ -2,6 +2,8 @@ package com.edufocus.edufocus.qna.controller;
import com.edufocus.edufocus.qna.entity.Qna; import com.edufocus.edufocus.qna.entity.Qna;
import com.edufocus.edufocus.qna.service.QnaService; import com.edufocus.edufocus.qna.service.QnaService;
import com.edufocus.edufocus.user.util.JWTUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import okhttp3.Response; import okhttp3.Response;
@ -18,12 +20,17 @@ import java.util.List;
@RequiredArgsConstructor @RequiredArgsConstructor
public class QnaController { public class QnaController {
private final QnaService qnaService; private final QnaService qnaService;
private final JWTUtil jwtUtil;
@PostMapping @PostMapping
public ResponseEntity<Qna> createQna(@RequestBody Qna qna) { public ResponseEntity<Qna> createQna(@RequestBody Qna qna , HttpServletRequest request) {
try{ try{
qnaService.createQna(qna); String token = request.getHeader("Authorization");
Long userId = Long.parseLong(jwtUtil.getUserId(token));
qnaService.createQna(userId,qna);
return new ResponseEntity<>(qna, HttpStatus.CREATED); return new ResponseEntity<>(qna, HttpStatus.CREATED);
}catch (Exception e){ }catch (Exception e){

View File

@ -11,7 +11,7 @@ import java.util.List;
@Service @Service
public interface QnaService { public interface QnaService {
void createQna(Qna qna) throws SQLException; void createQna(Long id,Qna qna) throws SQLException;
void updateQna(Long id,Qna qna) throws SQLException; void updateQna(Long id,Qna qna) throws SQLException;
void deleteQna(Long id) throws SQLException; void deleteQna(Long id) throws SQLException;
Qna getQna(Long id) throws SQLException; Qna getQna(Long id) throws SQLException;

View File

@ -20,9 +20,10 @@ public class QnaServiceImpl implements QnaService{
@Override @Override
public void createQna(Qna qna) { public void createQna(Long id,Qna qna) {
qna.setId(id);
qnaRepository.save(qna); qnaRepository.save(qna);
} }

View File

@ -5,7 +5,9 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
@Repository @Repository
public interface RegistrationRepository extends JpaRepository<Registration, Long> { public interface RegistrationRepository extends JpaRepository<Registration, Long> {
List<Registration> findAllByUserId(@Param("userId") Long userId);
} }

View File

@ -5,7 +5,9 @@ import com.edufocus.edufocus.user.model.service.UserService;
import com.edufocus.edufocus.user.util.JWTUtil; import com.edufocus.edufocus.user.util.JWTUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -48,7 +50,7 @@ public class UserController {
@Operation(summary = "로그인", description = "아이디와 비밀번호를 이용하여 로그인 처리.") @Operation(summary = "로그인", description = "아이디와 비밀번호를 이용하여 로그인 처리.")
@PostMapping("/login") @PostMapping("/login")
public ResponseEntity<Map<String, Object>> login( public ResponseEntity<Map<String, Object>> login(
@RequestBody @Parameter(description = "로그인 시 필요한 회원정보(아이디, 비밀번호).", required = true) User user) { @RequestBody @Parameter(description = "로그인 시 필요한 회원정보(아이디, 비밀번호).", required = true) User user, HttpServletResponse response) {
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
HttpStatus status = HttpStatus.ACCEPTED; HttpStatus status = HttpStatus.ACCEPTED;
try { try {
@ -63,8 +65,18 @@ public class UserController {
// JSON 으로 token 전달. // JSON 으로 token 전달.
System.out.println(accessToken); System.out.println(accessToken);
resultMap.put("access-token", accessToken); resultMap.put("access-token", accessToken);
resultMap.put("refresh-token", refreshToken); // resultMap.put("refresh-token", refreshToken);
// 쿠키 저장
Cookie refreshCookie = new Cookie("refresh-token", refreshToken);
refreshCookie.setPath("/");
refreshCookie.setHttpOnly(true);
refreshCookie.setSecure(true); // HTTPS에서만 전송되도록 설정
// refreshCookie.setSameSite(Cookie.SameSite.NONE); // Cross-Origin 요청에 대해 모두 전송
response.addCookie(refreshCookie);
// 쿠키저장
status = HttpStatus.CREATED; status = HttpStatus.CREATED;
} else { } else {
resultMap.put("message", "아이디 또는 패스워드를 확인해 주세요."); resultMap.put("message", "아이디 또는 패스워드를 확인해 주세요.");
@ -78,7 +90,7 @@ public class UserController {
} }
@Operation(summary = "회원인증", description = "회원 정보를 담은 Token 을 반환한다.") @Operation(summary = "회원인증", description = "회원 정보를 담은 Token 을 반환한다.")
@GetMapping("/info/{userId}") @GetMapping("/auth/{userId}")
public ResponseEntity<Map<String, Object>> getInfo( public ResponseEntity<Map<String, Object>> getInfo(
@PathVariable("userId") @Parameter(description = "인증할 회원의 아이디.", required = true) Long userId, @PathVariable("userId") @Parameter(description = "인증할 회원의 아이디.", required = true) Long userId,
HttpServletRequest request) { HttpServletRequest request) {
@ -129,19 +141,62 @@ public class UserController {
@Operation(summary = "Access Token 재발급", description = "만료된 access token 을 재발급 받는다.") @Operation(summary = "Access Token 재발급", description = "만료된 access token 을 재발급 받는다.")
@PostMapping("/refresh") @PostMapping("/refresh")
public ResponseEntity<?> refreshToken(@RequestBody User user, HttpServletRequest request) public ResponseEntity<?> refreshToken(HttpServletRequest request,HttpServletResponse response)
throws Exception { throws Exception {
// System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@");
// System.out.println(user.getUserId());
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
HttpStatus status = HttpStatus.ACCEPTED; HttpStatus status = HttpStatus.ACCEPTED;
String token = request.getHeader("refreshToken");
log.debug("token : {}, memberDto : {}", token, user); // String token = request.getHeader("refreshToken");
Cookie[] cookies = request.getCookies();
String token = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("refresh-token")) {
token = cookie.getValue();
break;
}
}
}
Long userId = Long.parseLong(jwtUtil.getUserId(token));
/// System.out.println(userId);
/// System.out.println("리프레쉬 토큰 (쿠키에서 받은거 "+token);
// log.debug("token : {}, memberDto : {}", token, user);
// System.out.println(jwtUtil.checkToken(token));
if (jwtUtil.checkToken(token)) { if (jwtUtil.checkToken(token)) {
if (token.equals(userService.getRefreshToken(user.getId()))) {
String accessToken = jwtUtil.createAccessToken(String.valueOf(user.getId())); // System.out.println(token);
// System.out.println(userService.getRefreshToken(userId));
//System.out.println("쿠키 토큰 , 디비 토큰 비교"+token.equals(userService.getRefreshToken(userId)));
if (token.equals(userService.getRefreshToken(userId))) {
System.out.println("!!");
String accessToken = jwtUtil.createAccessToken(String.valueOf(userId));
String refreshToken = jwtUtil.createRefreshToken(String.valueOf(userId));
log.debug("token : {}", accessToken); log.debug("token : {}", accessToken);
log.debug("정상적으로 access token 재발급!!!"); log.debug("정상적으로 access token 재발급!!!");
resultMap.put("access-token", accessToken); resultMap.put("access-token", accessToken);
// 바뀐 리프레시db저장
userService.saveRefreshToken(userId,refreshToken);
// 쿠키 저장
Cookie refreshCookie = new Cookie("refresh-token", refreshToken);
refreshCookie.setPath("/");
refreshCookie.setHttpOnly(true);
refreshCookie.setSecure(true); // HTTPS에서만 전송되도록 설정
// refreshCookie.setSameSite(Cookie.SameSite.NONE); // Cross-Origin 요청에 대해 모두 전송
response.addCookie(refreshCookie);
System.out.println("바뀐 리프레쉬랑 지금꺼 비교 "+ refreshToken.equals(token));
resultMap.put("access-token", accessToken);
status = HttpStatus.CREATED; status = HttpStatus.CREATED;
} }
} else { } else {
log.debug("refresh token 도 사용 불가!!!!!!!"); log.debug("refresh token 도 사용 불가!!!!!!!");
@ -151,7 +206,7 @@ public class UserController {
} }
@Operation(summary = "회원 정보 조회", description = "토큰을 이용하여 회원 정보를 조회한다.") @Operation(summary = "회원 정보 조회", description = "토큰을 이용하여 회원 정보를 조회한다.")
@GetMapping("/member") @GetMapping("/userinfo")
public ResponseEntity<Map<String, Object>> getMember(HttpServletRequest request) { public ResponseEntity<Map<String, Object>> getMember(HttpServletRequest request) {
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
HttpStatus status = HttpStatus.ACCEPTED; HttpStatus status = HttpStatus.ACCEPTED;

View File

@ -30,9 +30,10 @@ public class User {
private String password; private String password;
@Enumerated(EnumType.STRING) // 혹은 EnumType.ORDINAL @Enumerated(EnumType.STRING) // 혹은 EnumType.ORDINAL
private UserRole role; private UserRole role;
private String refreshToken; private String refreshToken;
private String name;