Merge branch 'backend' into be/ws
This commit is contained in:
commit
cfb999e7e7
@ -2,7 +2,9 @@ package com.edufocus.edufocus;
|
|||||||
|
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
|
||||||
|
|
||||||
|
@EnableJpaAuditing
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
public class EdufocusApplication {
|
public class EdufocusApplication {
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/board")
|
@RequestMapping("/board")
|
||||||
@CrossOrigin("*")
|
|
||||||
public class BoardController {
|
public class BoardController {
|
||||||
|
|
||||||
private final JWTUtil jwtUtil;
|
private final JWTUtil jwtUtil;
|
||||||
|
@ -5,7 +5,7 @@ import lombok.Builder;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.time.LocalTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
@Getter
|
@Getter
|
||||||
@ -17,6 +17,6 @@ public class ResponseBoardDetailDto {
|
|||||||
private String title;
|
private String title;
|
||||||
private String content;
|
private String content;
|
||||||
private int viewCount;
|
private int viewCount;
|
||||||
private LocalTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
private LocalTime modifiedAt;
|
private LocalDateTime modifiedAt;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,8 @@ import lombok.Builder;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -12,4 +14,5 @@ public class ResponseBoardSummaryDto {
|
|||||||
private long id;
|
private long id;
|
||||||
private String name;
|
private String name;
|
||||||
private String title;
|
private String title;
|
||||||
|
private LocalDateTime createdAt;
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import lombok.Builder;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
@ -13,6 +14,6 @@ public class ResponseCommentDto {
|
|||||||
private long id;
|
private long id;
|
||||||
private String name;
|
private String name;
|
||||||
private String content;
|
private String content;
|
||||||
private LocalTime createAt;
|
private LocalDateTime createAt;
|
||||||
private LocalTime modifiedAt;
|
private LocalDateTime modifiedAt;
|
||||||
}
|
}
|
||||||
|
@ -8,8 +8,11 @@ import com.edufocus.edufocus.user.model.entity.User;
|
|||||||
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
import org.hibernate.annotations.CreationTimestamp;
|
import org.springframework.data.annotation.CreatedDate;
|
||||||
|
import org.springframework.data.annotation.LastModifiedDate;
|
||||||
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -18,6 +21,7 @@ import java.util.List;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Setter
|
@Setter
|
||||||
|
@EntityListeners(AuditingEntityListener.class)
|
||||||
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
|
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
|
||||||
public class Board {
|
public class Board {
|
||||||
|
|
||||||
@ -37,11 +41,11 @@ public class Board {
|
|||||||
@Column(nullable = true)
|
@Column(nullable = true)
|
||||||
private int viewCount;
|
private int viewCount;
|
||||||
|
|
||||||
@CreationTimestamp
|
@CreatedDate
|
||||||
LocalTime createdAt;
|
LocalDateTime createdAt;
|
||||||
|
|
||||||
@CreationTimestamp
|
@LastModifiedDate
|
||||||
LocalTime modifiedAt;
|
LocalDateTime modifiedAt;
|
||||||
|
|
||||||
@ManyToOne(fetch = FetchType.LAZY)
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
@JoinColumn(name = "user_id")
|
@JoinColumn(name = "user_id")
|
||||||
@ -60,6 +64,7 @@ public class Board {
|
|||||||
.id(id)
|
.id(id)
|
||||||
.title(title)
|
.title(title)
|
||||||
.name(user.getUserId())
|
.name(user.getUserId())
|
||||||
|
.createdAt(createdAt)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ import lombok.Builder;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
import java.time.LocalTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Builder
|
@Builder
|
||||||
@ -26,10 +26,10 @@ public class Comment {
|
|||||||
private String content;
|
private String content;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private LocalTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private LocalTime modifiedAt;
|
private LocalDateTime modifiedAt;
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "user_id")
|
@JoinColumn(name = "user_id")
|
||||||
|
@ -5,15 +5,14 @@ import com.edufocus.edufocus.lecture.entity.LectureCreateRequest;
|
|||||||
import com.edufocus.edufocus.lecture.entity.LectureSearchResponse;
|
import com.edufocus.edufocus.lecture.entity.LectureSearchResponse;
|
||||||
import com.edufocus.edufocus.lecture.entity.LectureDetailResponse;
|
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 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;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -26,19 +25,19 @@ public class LectureController {
|
|||||||
private final LectureService lectureService;
|
private final LectureService lectureService;
|
||||||
private final JWTUtil jwtUtil;
|
private final JWTUtil jwtUtil;
|
||||||
|
|
||||||
@PostMapping
|
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
||||||
public ResponseEntity<?> createLecture(@RequestHeader("Authorization") String accessToken, @RequestBody LectureCreateRequest lectureCreateRequest) {
|
public ResponseEntity<?> createLecture(@RequestHeader("Authorization") String accessToken, @RequestPart LectureCreateRequest lectureCreateRequest
|
||||||
|
, @RequestPart(value = "image", required = false) MultipartFile image) throws Exception {
|
||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
Lecture lecture = lectureService.findLectureByTitle(lectureCreateRequest.getTitle());
|
Lecture lecture = lectureService.findLectureByTitle(lectureCreateRequest.getTitle());
|
||||||
if (lecture != null) {
|
if (lecture != null) {
|
||||||
String msg = new String("Duplicated Lecture");
|
return new ResponseEntity<>(HttpStatus.CONFLICT);
|
||||||
return new ResponseEntity<>(msg, HttpStatus.CONFLICT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lectureService.createLecture(userId, lectureCreateRequest);
|
lectureService.createLecture(userId, lectureCreateRequest, image);
|
||||||
String msg = new String("Lecture registered successfully");
|
|
||||||
return new ResponseEntity<>(msg, HttpStatus.CREATED);
|
return new ResponseEntity<>(HttpStatus.CREATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PutMapping("/{lectureId}")
|
@PutMapping("/{lectureId}")
|
||||||
@ -46,11 +45,9 @@ public class LectureController {
|
|||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
if (!lectureService.updateLecture(userId, lectureId, lectureCreateRequest)) {
|
if (!lectureService.updateLecture(userId, lectureId, lectureCreateRequest)) {
|
||||||
String msg = new String("Can't update Lecture");
|
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
||||||
return new ResponseEntity<>(msg, HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
}
|
||||||
String msg = new String("Lecture updated successfully");
|
return new ResponseEntity<>(HttpStatus.OK);
|
||||||
return new ResponseEntity<>(msg, HttpStatus.OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -59,8 +56,7 @@ public class LectureController {
|
|||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
if (!lectureService.deleteLecture(userId, lectureId)) {
|
if (!lectureService.deleteLecture(userId, lectureId)) {
|
||||||
String msg = new String("Can't delete Lecture");
|
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
||||||
return new ResponseEntity<>(msg, HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
||||||
@ -70,11 +66,6 @@ public class LectureController {
|
|||||||
public ResponseEntity<?> findAllLecture() {
|
public ResponseEntity<?> findAllLecture() {
|
||||||
List<LectureSearchResponse> lectures = lectureService.findAllLecture();
|
List<LectureSearchResponse> lectures = lectureService.findAllLecture();
|
||||||
|
|
||||||
if (lectures.isEmpty()) {
|
|
||||||
String msg = new String("No lectures found");
|
|
||||||
return new ResponseEntity<>(msg, HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ResponseEntity<>(lectures, HttpStatus.OK);
|
return new ResponseEntity<>(lectures, HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,34 +76,21 @@ public class LectureController {
|
|||||||
if (accessToken != null) {
|
if (accessToken != null) {
|
||||||
userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
LectureDetailResponse lectureDetailResponse = lectureService.findLectureById(userId, lectureId);
|
LectureDetailResponse lectureDetailResponse = lectureService.findLectureById(userId, lectureId);
|
||||||
|
|
||||||
if (lectureDetailResponse == null) {
|
|
||||||
String msg = new String("Can't find Lecture");
|
|
||||||
return new ResponseEntity<>(msg, HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return new ResponseEntity<>(lectureDetailResponse, HttpStatus.OK);
|
return new ResponseEntity<>(lectureDetailResponse, HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/mylecture")
|
@GetMapping("/mylecture")
|
||||||
public ResponseEntity<?> findMyLecture(@RequestHeader(value = "Authorization", required = false) String accessToken) {
|
public ResponseEntity<?> findMyLecture(@RequestHeader(value = "Authorization", required = false) String accessToken) {
|
||||||
if (accessToken == null) {
|
if (accessToken == null) {
|
||||||
String msg = new String("Not logged in");
|
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
||||||
return new ResponseEntity<>(msg, HttpStatus.OK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
List<LectureSearchResponse> myLectures = lectureService.findMyLecture(userId);
|
List<LectureSearchResponse> myLectures = lectureService.findMyLecture(userId);
|
||||||
|
|
||||||
if (myLectures.isEmpty()) {
|
|
||||||
String msg = new String("No lectures found");
|
|
||||||
return new ResponseEntity<>(msg, HttpStatus.OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ResponseEntity<>(myLectures, HttpStatus.OK);
|
return new ResponseEntity<>(myLectures, HttpStatus.OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,8 @@ import java.util.Date;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class Lecture {
|
public class Lecture {
|
||||||
|
|
||||||
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
@Column
|
@Column
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ -29,6 +30,9 @@ public class Lecture {
|
|||||||
@Lob
|
@Lob
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
|
@Lob
|
||||||
|
private String plan;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String image;
|
private String image;
|
||||||
|
|
||||||
@ -40,10 +44,10 @@ public class Lecture {
|
|||||||
@Temporal(TemporalType.DATE)
|
@Temporal(TemporalType.DATE)
|
||||||
private Date endDate;
|
private Date endDate;
|
||||||
|
|
||||||
@Lob
|
|
||||||
private String plan;
|
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
|
private String time;
|
||||||
|
|
||||||
|
@Column(columnDefinition = "boolean default false")
|
||||||
private boolean online;
|
private boolean online;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,12 +15,12 @@ public class LectureCreateRequest {
|
|||||||
|
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
private String image;
|
private String plan;
|
||||||
|
|
||||||
private Date startDate;
|
private Date startDate;
|
||||||
|
|
||||||
private Date endDate;
|
private Date endDate;
|
||||||
|
|
||||||
private String plan;
|
private String time;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,13 +21,15 @@ public class LectureDetailResponse {
|
|||||||
|
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
|
private String plan;
|
||||||
|
|
||||||
private String image;
|
private String image;
|
||||||
|
|
||||||
private Date startDate;
|
private Date startDate;
|
||||||
|
|
||||||
private Date endDate;
|
private Date endDate;
|
||||||
|
|
||||||
private String plan;
|
private String time;
|
||||||
|
|
||||||
private boolean online;
|
private boolean online;
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import com.edufocus.edufocus.lecture.entity.LectureCreateRequest;
|
|||||||
import com.edufocus.edufocus.lecture.entity.LectureSearchResponse;
|
import com.edufocus.edufocus.lecture.entity.LectureSearchResponse;
|
||||||
import com.edufocus.edufocus.lecture.entity.LectureDetailResponse;
|
import com.edufocus.edufocus.lecture.entity.LectureDetailResponse;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -12,7 +13,7 @@ import java.util.List;
|
|||||||
@Service
|
@Service
|
||||||
public interface LectureService {
|
public interface LectureService {
|
||||||
|
|
||||||
void createLecture(long userId, LectureCreateRequest lectureCreateRequest);
|
void createLecture(long userId, LectureCreateRequest lectureCreateRequest, MultipartFile image) throws Exception;
|
||||||
|
|
||||||
boolean updateLecture(long userId, long lectureId, LectureCreateRequest lectureCreateRequest);
|
boolean updateLecture(long userId, long lectureId, LectureCreateRequest lectureCreateRequest);
|
||||||
|
|
||||||
@ -25,4 +26,10 @@ public interface LectureService {
|
|||||||
List<LectureSearchResponse> findMyLecture(long userId);
|
List<LectureSearchResponse> findMyLecture(long userId);
|
||||||
|
|
||||||
Lecture findLectureByTitle(String title);
|
Lecture findLectureByTitle(String title);
|
||||||
|
|
||||||
|
void changeState(Long lectureId);
|
||||||
|
|
||||||
|
boolean getState(Long lectureId);
|
||||||
|
|
||||||
|
boolean checkTeacher(Long userId, Long lectureId);
|
||||||
}
|
}
|
||||||
|
@ -11,11 +11,14 @@ import com.edufocus.edufocus.user.model.repository.UserRepository;
|
|||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.io.IOException;
|
||||||
import java.util.Optional;
|
import java.util.*;
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
@Service
|
@Service
|
||||||
@ -30,19 +33,35 @@ public class LectureServiceImpl implements LectureService {
|
|||||||
private final RegistrationRepository registrationRepository;
|
private final RegistrationRepository registrationRepository;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createLecture(long userId, LectureCreateRequest lectureCreateRequest) {
|
public void createLecture(long userId, LectureCreateRequest lectureCreateRequest, MultipartFile image) throws IOException {
|
||||||
User user = userRepository.findById(userId).get();
|
User user = userRepository.findById(userId).get();
|
||||||
|
|
||||||
Lecture lecture = new Lecture().builder()
|
Lecture lecture = new Lecture().builder()
|
||||||
.user(user)
|
.user(user)
|
||||||
.title(lectureCreateRequest.getTitle())
|
.title(lectureCreateRequest.getTitle())
|
||||||
.description(lectureCreateRequest.getDescription())
|
.description(lectureCreateRequest.getDescription())
|
||||||
.image(lectureCreateRequest.getImage())
|
.plan(lectureCreateRequest.getPlan())
|
||||||
.startDate(lectureCreateRequest.getStartDate())
|
.startDate(lectureCreateRequest.getStartDate())
|
||||||
.endDate(lectureCreateRequest.getEndDate())
|
.endDate(lectureCreateRequest.getEndDate())
|
||||||
.plan(lectureCreateRequest.getPlan())
|
.time(lectureCreateRequest.getTime())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
if (image != null && !image.isEmpty()) {
|
||||||
|
String uid = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
String currentPath = "backend/src/main/resources/images/";
|
||||||
|
File checkPathFile = new File(currentPath);
|
||||||
|
if (!checkPathFile.exists()) {
|
||||||
|
checkPathFile.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
File savingImage = new File(currentPath + uid + "_" + image.getOriginalFilename());
|
||||||
|
image.transferTo(savingImage.toPath());
|
||||||
|
String savePath = savingImage.toPath().toString();
|
||||||
|
|
||||||
|
lecture.setImage(savePath);
|
||||||
|
}
|
||||||
|
|
||||||
lectureRepository.save(lecture);
|
lectureRepository.save(lecture);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,8 +79,8 @@ public class LectureServiceImpl implements LectureService {
|
|||||||
if (lectureCreateRequest.getDescription() != null) {
|
if (lectureCreateRequest.getDescription() != null) {
|
||||||
lecture.setDescription(lectureCreateRequest.getDescription());
|
lecture.setDescription(lectureCreateRequest.getDescription());
|
||||||
}
|
}
|
||||||
if (lectureCreateRequest.getImage() != null) {
|
if (lectureCreateRequest.getPlan() != null) {
|
||||||
lecture.setImage(lectureCreateRequest.getImage());
|
lecture.setPlan(lectureCreateRequest.getPlan());
|
||||||
}
|
}
|
||||||
if (lectureCreateRequest.getStartDate() != null) {
|
if (lectureCreateRequest.getStartDate() != null) {
|
||||||
lecture.setStartDate(lectureCreateRequest.getStartDate());
|
lecture.setStartDate(lectureCreateRequest.getStartDate());
|
||||||
@ -69,8 +88,8 @@ public class LectureServiceImpl implements LectureService {
|
|||||||
if (lectureCreateRequest.getEndDate() != null) {
|
if (lectureCreateRequest.getEndDate() != null) {
|
||||||
lecture.setEndDate(lectureCreateRequest.getEndDate());
|
lecture.setEndDate(lectureCreateRequest.getEndDate());
|
||||||
}
|
}
|
||||||
if (lectureCreateRequest.getPlan() != null) {
|
if (lectureCreateRequest.getTime() != null) {
|
||||||
lecture.setPlan(lectureCreateRequest.getPlan());
|
lecture.setTime(lectureCreateRequest.getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
lectureRepository.save(lecture);
|
lectureRepository.save(lecture);
|
||||||
@ -114,11 +133,9 @@ public class LectureServiceImpl implements LectureService {
|
|||||||
@Override
|
@Override
|
||||||
public LectureDetailResponse findLectureById(Long userId, long lectureId) {
|
public LectureDetailResponse findLectureById(Long userId, long lectureId) {
|
||||||
Optional<Lecture> lecture = lectureRepository.findById(lectureId);
|
Optional<Lecture> lecture = lectureRepository.findById(lectureId);
|
||||||
|
|
||||||
if (lecture.isEmpty()) {
|
if (lecture.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
lecture = Optional.of(lecture.get());
|
|
||||||
|
|
||||||
String userStatus;
|
String userStatus;
|
||||||
if (userId == null) {
|
if (userId == null) {
|
||||||
@ -149,10 +166,11 @@ public class LectureServiceImpl implements LectureService {
|
|||||||
.id(lecture.get().getId())
|
.id(lecture.get().getId())
|
||||||
.title(lecture.get().getTitle())
|
.title(lecture.get().getTitle())
|
||||||
.description(lecture.get().getDescription())
|
.description(lecture.get().getDescription())
|
||||||
|
.plan(lecture.get().getPlan())
|
||||||
.image(lecture.get().getImage())
|
.image(lecture.get().getImage())
|
||||||
.startDate(lecture.get().getStartDate())
|
.startDate(lecture.get().getStartDate())
|
||||||
.endDate(lecture.get().getEndDate())
|
.endDate(lecture.get().getEndDate())
|
||||||
.plan(lecture.get().getPlan())
|
.time(lecture.get().getTime())
|
||||||
.online(lecture.get().isOnline())
|
.online(lecture.get().isOnline())
|
||||||
.teacherName(lecture.get().getUser().getName())
|
.teacherName(lecture.get().getUser().getName())
|
||||||
.status(userStatus)
|
.status(userStatus)
|
||||||
@ -198,4 +216,41 @@ public class LectureServiceImpl implements LectureService {
|
|||||||
public Lecture findLectureByTitle(String title) {
|
public Lecture findLectureByTitle(String title) {
|
||||||
return lectureRepository.findByTitle(title);
|
return lectureRepository.findByTitle(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changeState(Long id) {
|
||||||
|
|
||||||
|
Optional<Lecture> lecture = lectureRepository.findById(id);
|
||||||
|
|
||||||
|
Lecture l;
|
||||||
|
if (lecture.isPresent()) {
|
||||||
|
l = lecture.get();
|
||||||
|
|
||||||
|
System.out.println(l.isOnline());
|
||||||
|
l.setOnline(true);
|
||||||
|
System.out.println(l.isOnline());
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
throw new RuntimeException("Lecture not found with id: " + id);
|
||||||
|
}
|
||||||
|
lectureRepository.save(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getState(Long lectureId) {
|
||||||
|
|
||||||
|
Lecture lecture= lectureRepository.findById(lectureId).orElse(null);
|
||||||
|
return lecture.isOnline();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkTeacher(Long userId, Long lectureId) {
|
||||||
|
Optional<Lecture> lecture = lectureRepository.findById(lectureId);
|
||||||
|
|
||||||
|
return lecture.isPresent() && lecture.get().getUser().getId() == userId;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -106,9 +106,9 @@ public class QnaController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/{id}")
|
@GetMapping("/{id}")
|
||||||
public ResponseEntity<Qna> getQna(@PathVariable Long id) {
|
public ResponseEntity<QnaResponseDto> getQna(@PathVariable Long id) {
|
||||||
try{
|
try{
|
||||||
Qna findQna= qnaService.getQna(id);
|
QnaResponseDto findQna= qnaService.getQna(id);
|
||||||
return new ResponseEntity<>(findQna, HttpStatus.ACCEPTED);
|
return new ResponseEntity<>(findQna, HttpStatus.ACCEPTED);
|
||||||
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
@ -14,6 +14,7 @@ import java.util.Date;
|
|||||||
public class QnaResponseDto {
|
public class QnaResponseDto {
|
||||||
|
|
||||||
|
|
||||||
|
private Long id;
|
||||||
private String title;
|
private String title;
|
||||||
private String username;
|
private String username;
|
||||||
private String content;
|
private String content;
|
||||||
@ -22,7 +23,7 @@ public class QnaResponseDto {
|
|||||||
public static QnaResponseDto toEntity(Qna qna)
|
public static QnaResponseDto toEntity(Qna qna)
|
||||||
{
|
{
|
||||||
return new QnaResponseDto(
|
return new QnaResponseDto(
|
||||||
|
qna.getId(),
|
||||||
qna.getTitle(),
|
qna.getTitle(),
|
||||||
qna.getUser().getName(),
|
qna.getUser().getName(),
|
||||||
qna.getContent(),
|
qna.getContent(),
|
||||||
|
@ -13,7 +13,6 @@ import java.util.List;
|
|||||||
@Repository
|
@Repository
|
||||||
public interface QnaRepository extends JpaRepository<Qna, Long> {
|
public interface QnaRepository extends JpaRepository<Qna, Long> {
|
||||||
|
|
||||||
|
|
||||||
List<Qna> findByLectureId(Long lecturerId);
|
List<Qna> findByLectureId(Long lecturerId);
|
||||||
Page<Qna> findByLectureId(Long lectureId, Pageable pageable);
|
Page<Qna> findByLectureId(Long lectureId, Pageable pageable);
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ public interface QnaService {
|
|||||||
QnaResponseDto createQna(Long id, QnaRequestDto qnaRequestDto, Long lecture_id) throws SQLException;
|
QnaResponseDto createQna(Long id, QnaRequestDto qnaRequestDto, Long lecture_id) throws SQLException;
|
||||||
QnaResponseDto updateQna(Long id,QnaRequestDto qnaRequestDto) throws SQLException;
|
QnaResponseDto updateQna(Long id,QnaRequestDto qnaRequestDto) throws SQLException;
|
||||||
void deleteQna(Long id) throws SQLException;
|
void deleteQna(Long id) throws SQLException;
|
||||||
Qna getQna(Long id) throws SQLException;
|
QnaResponseDto getQna(Long id) throws SQLException;
|
||||||
|
|
||||||
List<QnaResponseDto> getAllQnasByLecture(Long lectureId,int pageNumber) throws SQLException;
|
List<QnaResponseDto> getAllQnasByLecture(Long lectureId,int pageNumber) throws SQLException;
|
||||||
QnaResponseDto createAnswer(Long id,QnaRequestDto qnaRequestDto) throws SQLException;
|
QnaResponseDto createAnswer(Long id,QnaRequestDto qnaRequestDto) throws SQLException;
|
||||||
|
@ -80,8 +80,22 @@ qnaRepository.deleteById(id);
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Qna getQna(Long id) {
|
public QnaResponseDto getQna(Long id) {
|
||||||
return null;
|
Optional<Qna> qna;
|
||||||
|
try {
|
||||||
|
|
||||||
|
qna= qnaRepository.findById(id);
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
throw new RuntimeException("Qna 없음 " + id, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return QnaResponseDto.toEntity(qna.get());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
package com.edufocus.edufocus.quiz.controller;
|
package com.edufocus.edufocus.quiz.controller;
|
||||||
|
|
||||||
import com.edufocus.edufocus.quiz.entity.*;
|
import com.edufocus.edufocus.quiz.entity.*;
|
||||||
import com.edufocus.edufocus.quiz.repository.QuizRepository;
|
|
||||||
import com.edufocus.edufocus.quiz.service.QuizService;
|
import com.edufocus.edufocus.quiz.service.QuizService;
|
||||||
import com.edufocus.edufocus.quiz.service.QuizSetService;
|
import com.edufocus.edufocus.quiz.service.QuizSetService;
|
||||||
import com.edufocus.edufocus.user.model.service.UserService;
|
|
||||||
import com.edufocus.edufocus.user.util.JWTUtil;
|
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;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@ -25,24 +25,18 @@ public class QuizController {
|
|||||||
|
|
||||||
private final QuizSetService quizSetService;
|
private final QuizSetService quizSetService;
|
||||||
|
|
||||||
private final UserService userService;
|
|
||||||
|
|
||||||
private final JWTUtil jwtUtil;
|
private final JWTUtil jwtUtil;
|
||||||
private final QuizRepository quizRepository;
|
|
||||||
|
|
||||||
@PostMapping
|
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
||||||
public ResponseEntity<?> createQuizSet(@RequestHeader("Authorization") String accessToken, @RequestBody QuizSetCreateRequest quizSetCreateRequest) {
|
public ResponseEntity<?> createQuizSet(@RequestHeader("Authorization") String accessToken, @RequestPart QuizSetCreateRequest quizSetCreateRequest
|
||||||
|
, @RequestPart(value = "images", required = false) List<MultipartFile> images) throws IOException {
|
||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
String title = quizSetCreateRequest.getTitle();
|
QuizSet quizSet = quizSetService.createQuizSet(userId, quizSetCreateRequest.getTitle());
|
||||||
String image = quizSetCreateRequest.getImage();
|
|
||||||
|
|
||||||
SetCreateRequest setCreateRequest = new SetCreateRequest(userId, title, image);
|
|
||||||
|
|
||||||
QuizSet quizSet = quizSetService.createQuizSet(setCreateRequest);
|
|
||||||
|
|
||||||
|
int imageIdx = 0;
|
||||||
for (QuizCreateRequest quizCreateRequest : quizSetCreateRequest.getQuizzes()) {
|
for (QuizCreateRequest quizCreateRequest : quizSetCreateRequest.getQuizzes()) {
|
||||||
quizService.createQuiz(quizSet.getId(), quizCreateRequest);
|
quizService.createQuiz(quizSet, quizCreateRequest, images.get(imageIdx++));
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ResponseEntity<>(HttpStatus.CREATED);
|
return new ResponseEntity<>(HttpStatus.CREATED);
|
||||||
@ -50,8 +44,30 @@ public class QuizController {
|
|||||||
|
|
||||||
@GetMapping("/{quizsetId}")
|
@GetMapping("/{quizsetId}")
|
||||||
public ResponseEntity<?> getQuizzes(@PathVariable Long quizsetId) {
|
public ResponseEntity<?> getQuizzes(@PathVariable Long quizsetId) {
|
||||||
QuizSet quizSet = quizSetService.findQuizSet(quizsetId);
|
QuizSetResponse quizSet = quizSetService.findQuizSetResponse(quizsetId);
|
||||||
|
|
||||||
|
if (quizSet == null) {
|
||||||
|
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
return new ResponseEntity<>(quizSet, HttpStatus.OK);
|
return new ResponseEntity<>(quizSet, HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/{quizsetId}")
|
||||||
|
public ResponseEntity<?> deleteQuizSet(@RequestHeader("Authorization") String accessToken, @PathVariable Long quizsetId) {
|
||||||
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
|
if (!quizSetService.deleteQuizSet(userId, quizsetId)) {
|
||||||
|
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
public ResponseEntity<?> getQuizSets(@RequestHeader("Authorization") String accessToken) {
|
||||||
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
|
return new ResponseEntity<>(quizSetService.findMyQuizSetResponses(userId), HttpStatus.OK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
package com.edufocus.edufocus.quiz.entity;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonBackReference;
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class Choice {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ManyToOne
|
||||||
|
@JoinColumn(name = "QuizId")
|
||||||
|
@JsonBackReference
|
||||||
|
private Quiz quiz;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private int num;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String content;
|
||||||
|
}
|
@ -7,12 +7,9 @@ import lombok.NoArgsConstructor;
|
|||||||
@Getter
|
@Getter
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class SetCreateRequest {
|
public class ChoiceCreateRequest {
|
||||||
|
|
||||||
private Long UserId;
|
private int num;
|
||||||
|
|
||||||
private String title;
|
|
||||||
|
|
||||||
private String image;
|
|
||||||
|
|
||||||
|
private String content;
|
||||||
}
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.edufocus.edufocus.quiz.entity;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class MyQuizSetResponse {
|
||||||
|
|
||||||
|
private Long quizSetId;
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
}
|
@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonManagedReference;
|
|||||||
import jakarta.persistence.*;
|
import jakarta.persistence.*;
|
||||||
import lombok.*;
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ -23,31 +25,17 @@ public class Quiz {
|
|||||||
private QuizSet quizSet;
|
private QuizSet quizSet;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String title;
|
private String question;
|
||||||
|
|
||||||
@Column
|
|
||||||
private String description;
|
|
||||||
|
|
||||||
@Column
|
|
||||||
private String answer;
|
|
||||||
|
|
||||||
@Column (name = "is_single")
|
|
||||||
private boolean isSingle;
|
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String image;
|
private String image;
|
||||||
|
|
||||||
@Column
|
@Column
|
||||||
private String choice1;
|
private String answer;
|
||||||
|
|
||||||
@Column
|
@OneToMany(mappedBy = "quiz", orphanRemoval = true, cascade = CascadeType.ALL)
|
||||||
private String choice2;
|
@JsonManagedReference
|
||||||
|
private List<Choice> choices;
|
||||||
@Column
|
|
||||||
private String choice3;
|
|
||||||
|
|
||||||
@Column
|
|
||||||
private String choice4;
|
|
||||||
|
|
||||||
public void setQuizSet(QuizSet quizSet) {
|
public void setQuizSet(QuizSet quizSet) {
|
||||||
this.quizSet = quizSet;
|
this.quizSet = quizSet;
|
||||||
@ -56,4 +44,12 @@ public class Quiz {
|
|||||||
quizSet.getQuizzes().remove(this);
|
quizSet.getQuizzes().remove(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addChoice(Choice choice) {
|
||||||
|
this.choices.add(choice);
|
||||||
|
|
||||||
|
if (choice.getQuiz() != this) {
|
||||||
|
choice.setQuiz(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,26 +4,16 @@ import lombok.AllArgsConstructor;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class QuizCreateRequest {
|
public class QuizCreateRequest {
|
||||||
|
|
||||||
private String title;
|
private String question;
|
||||||
|
|
||||||
private String description;
|
|
||||||
|
|
||||||
private String answer;
|
private String answer;
|
||||||
|
|
||||||
private boolean isSingle;
|
private List<ChoiceCreateRequest> choices;
|
||||||
|
|
||||||
private String image;
|
|
||||||
|
|
||||||
private String choice1;
|
|
||||||
|
|
||||||
private String choice2;
|
|
||||||
|
|
||||||
private String choice3;
|
|
||||||
|
|
||||||
private String choice4;
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.edufocus.edufocus.quiz.entity;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class QuizResponse {
|
||||||
|
|
||||||
|
private String question;
|
||||||
|
|
||||||
|
private String image;
|
||||||
|
|
||||||
|
private List<Choice> choices;
|
||||||
|
}
|
@ -27,12 +27,9 @@ public class QuizSet {
|
|||||||
@Column
|
@Column
|
||||||
private String title;
|
private String title;
|
||||||
|
|
||||||
@Column
|
@OneToMany(mappedBy = "quizSet", orphanRemoval = true)
|
||||||
private String image;
|
|
||||||
|
|
||||||
@OneToMany(mappedBy = "quizSet")
|
|
||||||
@JsonManagedReference
|
@JsonManagedReference
|
||||||
private List<Quiz> quizzes = new ArrayList<Quiz>();
|
private List<Quiz> quizzes = new ArrayList<Quiz>();
|
||||||
|
|
||||||
public void addQuiz(Quiz quiz) {
|
public void addQuiz(Quiz quiz) {
|
||||||
this.quizzes.add(quiz);
|
this.quizzes.add(quiz);
|
||||||
|
@ -11,12 +11,8 @@ import java.util.List;
|
|||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class QuizSetCreateRequest {
|
public class QuizSetCreateRequest {
|
||||||
|
|
||||||
private Long UserId;
|
|
||||||
|
|
||||||
private String title;
|
private String title;
|
||||||
|
|
||||||
private String image;
|
|
||||||
|
|
||||||
private List<QuizCreateRequest> quizzes;
|
private List<QuizCreateRequest> quizzes;
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.edufocus.edufocus.quiz.entity;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class QuizSetResponse {
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
private List<QuizResponse> quizzes;
|
||||||
|
}
|
@ -3,7 +3,6 @@ package com.edufocus.edufocus.quiz.repository;
|
|||||||
import com.edufocus.edufocus.quiz.entity.Quiz;
|
import com.edufocus.edufocus.quiz.entity.Quiz;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
|
||||||
public interface QuizRepository extends JpaRepository<Quiz, Long> {
|
public interface QuizRepository extends JpaRepository<Quiz, Long> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,9 @@ package com.edufocus.edufocus.quiz.repository;
|
|||||||
import com.edufocus.edufocus.quiz.entity.QuizSet;
|
import com.edufocus.edufocus.quiz.entity.QuizSet;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface QuizSetRepository extends JpaRepository<QuizSet, Long> {
|
public interface QuizSetRepository extends JpaRepository<QuizSet, Long> {
|
||||||
|
|
||||||
|
List<QuizSet> findQuizSetsByUserId(Long userId);
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
package com.edufocus.edufocus.quiz.service;
|
package com.edufocus.edufocus.quiz.service;
|
||||||
|
|
||||||
import com.edufocus.edufocus.quiz.entity.QuizCreateRequest;
|
import com.edufocus.edufocus.quiz.entity.QuizCreateRequest;
|
||||||
|
import com.edufocus.edufocus.quiz.entity.QuizSet;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public interface QuizService {
|
public interface QuizService {
|
||||||
|
|
||||||
void createQuiz(long quizSetId, QuizCreateRequest
|
void createQuiz(QuizSet quizSet, QuizCreateRequest quizCreateRequest, MultipartFile quizImage) throws IOException;
|
||||||
QuizCreateRequest);
|
|
||||||
|
|
||||||
boolean deleteQuiz(long quizId);
|
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,18 @@
|
|||||||
package com.edufocus.edufocus.quiz.service;
|
package com.edufocus.edufocus.quiz.service;
|
||||||
|
|
||||||
import com.edufocus.edufocus.quiz.entity.Quiz;
|
import com.edufocus.edufocus.quiz.entity.*;
|
||||||
import com.edufocus.edufocus.quiz.entity.QuizCreateRequest;
|
|
||||||
import com.edufocus.edufocus.quiz.entity.QuizSet;
|
|
||||||
import com.edufocus.edufocus.quiz.repository.QuizRepository;
|
import com.edufocus.edufocus.quiz.repository.QuizRepository;
|
||||||
import com.edufocus.edufocus.quiz.repository.QuizSetRepository;
|
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional
|
@Transactional
|
||||||
@ -18,39 +21,45 @@ public class QuizServiceImpl implements QuizService {
|
|||||||
|
|
||||||
private final QuizRepository quizRepository;
|
private final QuizRepository quizRepository;
|
||||||
|
|
||||||
private final QuizSetRepository quizSetRepository;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createQuiz(long quizSetId, QuizCreateRequest quizCreateRequest) {
|
public void createQuiz(QuizSet quizSet, QuizCreateRequest quizCreateRequest, MultipartFile quizImage) throws IOException {
|
||||||
QuizSet quizSet = quizSetRepository.findById(quizSetId).get();
|
|
||||||
|
|
||||||
Quiz quiz = new Quiz().builder()
|
Quiz quiz = new Quiz().builder()
|
||||||
.title(quizCreateRequest.getTitle())
|
|
||||||
.description(quizCreateRequest.getDescription())
|
|
||||||
.answer(quizCreateRequest.getAnswer())
|
|
||||||
.image(quizCreateRequest.getImage())
|
|
||||||
.quizSet(quizSet)
|
.quizSet(quizSet)
|
||||||
|
.question(quizCreateRequest.getQuestion())
|
||||||
|
.answer(quizCreateRequest.getAnswer())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
if (!quiz.isSingle()) {
|
List<Choice> choices = new ArrayList<>();
|
||||||
quiz.setChoice1(quizCreateRequest.getChoice1());
|
|
||||||
quiz.setChoice2(quizCreateRequest.getChoice2());
|
for (ChoiceCreateRequest choiceCreateRequest : quizCreateRequest.getChoices()) {
|
||||||
quiz.setChoice3(quizCreateRequest.getChoice3());
|
Choice choice = new Choice().builder()
|
||||||
quiz.setChoice4(quizCreateRequest.getChoice4());
|
.quiz(quiz)
|
||||||
|
.num(choiceCreateRequest.getNum())
|
||||||
|
.content(choiceCreateRequest.getContent())
|
||||||
|
.build();
|
||||||
|
choices.add(choice);
|
||||||
|
}
|
||||||
|
|
||||||
|
quiz.setChoices(choices);
|
||||||
|
|
||||||
|
if (quizImage != null && !quizImage.isEmpty()) {
|
||||||
|
String uid = UUID.randomUUID().toString();
|
||||||
|
|
||||||
|
String currentPath = "backend/src/main/resources/images/quizzes/";
|
||||||
|
File checkPathFile = new File(currentPath);
|
||||||
|
if (!checkPathFile.exists()) {
|
||||||
|
checkPathFile.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
File savingImage = new File(currentPath + uid + "_" + quizImage.getOriginalFilename());
|
||||||
|
quizImage.transferTo(savingImage.toPath());
|
||||||
|
String savePath = savingImage.toPath().toString();
|
||||||
|
|
||||||
|
quiz.setImage(savePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
quizRepository.save(quiz);
|
quizRepository.save(quiz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean deleteQuiz(long quizId) {
|
|
||||||
// 유저 아이디 정보 조회 후 검증 로직 추가 예정
|
|
||||||
// jwt -> 로그인 유저 정보 조회
|
|
||||||
// quizId -> 퀴즈 정보 조회 -> 퀴즈셋 정보 조회
|
|
||||||
// 퀴즈셋 생성자와 로그인 유저의 id값이 일치하는지 확인 -> 불일치시 삭제 실패
|
|
||||||
|
|
||||||
quizRepository.deleteById(quizId);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,24 @@
|
|||||||
package com.edufocus.edufocus.quiz.service;
|
package com.edufocus.edufocus.quiz.service;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.quiz.entity.MyQuizSetResponse;
|
||||||
import com.edufocus.edufocus.quiz.entity.QuizSet;
|
import com.edufocus.edufocus.quiz.entity.QuizSet;
|
||||||
import com.edufocus.edufocus.quiz.entity.SetCreateRequest;
|
import com.edufocus.edufocus.quiz.entity.QuizSetResponse;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public interface QuizSetService {
|
public interface QuizSetService {
|
||||||
|
|
||||||
QuizSet createQuizSet(SetCreateRequest setCreateRequest);
|
QuizSet createQuizSet(Long userId, String title);
|
||||||
|
|
||||||
void updateQuizSet(QuizSet quizSet);
|
void updateQuizSet(QuizSet quizSet);
|
||||||
|
|
||||||
void deleteQuizSet(long quizSetId);
|
boolean deleteQuizSet(Long userId, Long quizSetId);
|
||||||
|
|
||||||
QuizSet findQuizSet(long quizSetId);
|
QuizSet findQuizSet(Long quizSetId);
|
||||||
|
|
||||||
|
QuizSetResponse findQuizSetResponse(Long quizSetId);
|
||||||
|
|
||||||
|
List<MyQuizSetResponse> findMyQuizSetResponses(Long userId);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.edufocus.edufocus.quiz.service;
|
package com.edufocus.edufocus.quiz.service;
|
||||||
|
|
||||||
import com.edufocus.edufocus.quiz.entity.*;
|
import com.edufocus.edufocus.quiz.entity.*;
|
||||||
import com.edufocus.edufocus.quiz.repository.QuizRepository;
|
|
||||||
import com.edufocus.edufocus.quiz.repository.QuizSetRepository;
|
import com.edufocus.edufocus.quiz.repository.QuizSetRepository;
|
||||||
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;
|
||||||
@ -9,6 +8,10 @@ import jakarta.transaction.Transactional;
|
|||||||
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.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional
|
@Transactional
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ -17,19 +20,14 @@ public class QuizSetServiceImpl implements QuizSetService {
|
|||||||
private final QuizSetRepository quizSetRepository;
|
private final QuizSetRepository quizSetRepository;
|
||||||
|
|
||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
private final QuizRepository quizRepository;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public QuizSet createQuizSet(SetCreateRequest setCreateRequest) {
|
public QuizSet createQuizSet(Long userId, String title) {
|
||||||
QuizSet quizSet = new QuizSet();
|
QuizSet quizSet = new QuizSet();
|
||||||
|
|
||||||
User user = userRepository.findById(setCreateRequest.getUserId()).get();
|
User user = userRepository.findById(userId).get();
|
||||||
|
|
||||||
quizSet.setUser(user);
|
quizSet.setUser(user);
|
||||||
|
quizSet.setTitle(title);
|
||||||
quizSet.setTitle(setCreateRequest.getTitle());
|
|
||||||
quizSet.setImage(setCreateRequest.getImage());
|
|
||||||
|
|
||||||
return quizSetRepository.save(quizSet);
|
return quizSetRepository.save(quizSet);
|
||||||
}
|
}
|
||||||
@ -40,12 +38,65 @@ public class QuizSetServiceImpl implements QuizSetService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteQuizSet(long quizSetId) {
|
public boolean deleteQuizSet(Long userId, Long quizSetId) {
|
||||||
|
Optional<QuizSet> quizSet = quizSetRepository.findById(quizSetId);
|
||||||
|
|
||||||
|
if (quizSet.isEmpty() || userId != quizSet.get().getUser().getId()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
quizSetRepository.deleteById(quizSetId);
|
quizSetRepository.deleteById(quizSetId);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public QuizSet findQuizSet(long quizSetId) {
|
public QuizSet findQuizSet(Long quizSetId) {
|
||||||
return quizSetRepository.findById(quizSetId).get();
|
return quizSetRepository.findById(quizSetId).get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public QuizSetResponse findQuizSetResponse(Long quizSetId) {
|
||||||
|
Optional<QuizSet> quizSet = quizSetRepository.findById(quizSetId);
|
||||||
|
|
||||||
|
if (quizSet.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
List<QuizResponse> quizResponses = new ArrayList<>();
|
||||||
|
for (Quiz quiz : quizSet.get().getQuizzes()) {
|
||||||
|
QuizResponse quizResponse = new QuizResponse().builder()
|
||||||
|
.question(quiz.getQuestion())
|
||||||
|
.image(quiz.getImage())
|
||||||
|
.choices(quiz.getChoices())
|
||||||
|
.build();
|
||||||
|
quizResponses.add(quizResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
QuizSetResponse quizSetResponse = new QuizSetResponse().builder()
|
||||||
|
.title(quizSet.get().getTitle())
|
||||||
|
.quizzes(quizResponses)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return quizSetResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<MyQuizSetResponse> findMyQuizSetResponses(Long userId) {
|
||||||
|
List<QuizSet> quizSetList = quizSetRepository.findQuizSetsByUserId(userId);
|
||||||
|
|
||||||
|
List<MyQuizSetResponse> myQuizSetResponses = new ArrayList<>();
|
||||||
|
for (QuizSet quizSet : quizSetList) {
|
||||||
|
MyQuizSetResponse myQuizSetResponse = new MyQuizSetResponse().builder()
|
||||||
|
.quizSetId(quizSet.getId())
|
||||||
|
.title(quizSet.getTitle())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
myQuizSetResponses.add(myQuizSetResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
return myQuizSetResponses;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.edufocus.edufocus.registration.controller;
|
package com.edufocus.edufocus.registration.controller;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.lecture.service.LectureService;
|
||||||
import com.edufocus.edufocus.registration.service.RegistrationService;
|
import com.edufocus.edufocus.registration.service.RegistrationService;
|
||||||
import com.edufocus.edufocus.user.util.JWTUtil;
|
import com.edufocus.edufocus.user.util.JWTUtil;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@ -16,7 +17,9 @@ import java.util.Map;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class RegistrationController {
|
public class RegistrationController {
|
||||||
|
|
||||||
private final RegistrationService registrationServiceImpl;
|
private final RegistrationService registrationService;
|
||||||
|
|
||||||
|
private final LectureService lectureService;
|
||||||
|
|
||||||
private final JWTUtil jwtUtil;
|
private final JWTUtil jwtUtil;
|
||||||
|
|
||||||
@ -25,12 +28,10 @@ public class RegistrationController {
|
|||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
Long lectureId = map.get("lectureId");
|
Long lectureId = map.get("lectureId");
|
||||||
|
|
||||||
if (!registrationServiceImpl.createRegistration(userId, lectureId)) {
|
if (!registrationService.createRegistration(userId, lectureId)) {
|
||||||
String msg = new String("Duplicated Registration");
|
return new ResponseEntity<>(HttpStatus.CONFLICT);
|
||||||
return new ResponseEntity<>(msg, HttpStatus.CONFLICT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String msg = new String("registration successful");
|
|
||||||
return new ResponseEntity<>(HttpStatus.CREATED);
|
return new ResponseEntity<>(HttpStatus.CREATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,12 +39,10 @@ public class RegistrationController {
|
|||||||
public ResponseEntity<?> acceptRigistration(@RequestHeader("Authorization") String accessToken, @PathVariable long registrationId) {
|
public ResponseEntity<?> acceptRigistration(@RequestHeader("Authorization") String accessToken, @PathVariable long registrationId) {
|
||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
if (!registrationServiceImpl.acceptRegistration(userId, registrationId)) {
|
if (!registrationService.acceptRegistration(userId, registrationId)) {
|
||||||
String msg = new String("Not Acceptable");
|
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String msg = new String("registration accepted");
|
|
||||||
return new ResponseEntity<>(HttpStatus.OK);
|
return new ResponseEntity<>(HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,12 +50,22 @@ public class RegistrationController {
|
|||||||
public ResponseEntity<?> deleteRigistration(@RequestHeader("Authorization") String accessToken, @PathVariable long registrationId) {
|
public ResponseEntity<?> deleteRigistration(@RequestHeader("Authorization") String accessToken, @PathVariable long registrationId) {
|
||||||
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
if (!registrationServiceImpl.deleteRegistration(userId, registrationId)) {
|
if (!registrationService.deleteRegistration(userId, registrationId)) {
|
||||||
String msg = new String("Not Acceptable");
|
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||||
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/{lectureId}")
|
||||||
|
public ResponseEntity<?> getRegistrations(@RequestHeader("Authorization") String accessToken, @PathVariable long lectureId) {
|
||||||
|
Long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
|
||||||
|
|
||||||
|
if (!lectureService.checkTeacher(userId, lectureId)) {
|
||||||
|
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ResponseEntity<>(registrationService.searchRegistrations(lectureId), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -26,5 +26,5 @@ public class Registration {
|
|||||||
private Lecture lecture;
|
private Lecture lecture;
|
||||||
|
|
||||||
@Enumerated(EnumType.STRING)
|
@Enumerated(EnumType.STRING)
|
||||||
private RegistrationStatus status ;
|
private RegistrationStatus status;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
package com.edufocus.edufocus.registration.entity;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.lecture.entity.Lecture;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class RegistrationSearchResponse {
|
||||||
|
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String userName;
|
||||||
|
}
|
@ -2,6 +2,7 @@ package com.edufocus.edufocus.registration.repository;
|
|||||||
|
|
||||||
import com.edufocus.edufocus.registration.entity.Registration;
|
import com.edufocus.edufocus.registration.entity.Registration;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
@ -11,5 +12,7 @@ import java.util.List;
|
|||||||
public interface RegistrationRepository extends JpaRepository<Registration, Long> {
|
public interface RegistrationRepository extends JpaRepository<Registration, Long> {
|
||||||
List<Registration> findAllByUserId(@Param("userId") Long userId);
|
List<Registration> findAllByUserId(@Param("userId") Long userId);
|
||||||
|
|
||||||
|
List<Registration> findAllNotAcceptedByLectureId(@Param("lectureId") Long lectureId);
|
||||||
|
|
||||||
Registration findByUserIdAndLectureId(Long userId, Long lectureId);
|
Registration findByUserIdAndLectureId(Long userId, Long lectureId);
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,22 @@
|
|||||||
package com.edufocus.edufocus.registration.service;
|
package com.edufocus.edufocus.registration.service;
|
||||||
|
|
||||||
import com.edufocus.edufocus.registration.entity.Registration;
|
import com.edufocus.edufocus.registration.entity.Registration;
|
||||||
|
import com.edufocus.edufocus.registration.entity.RegistrationSearchResponse;
|
||||||
|
import com.edufocus.edufocus.registration.entity.RegistrationStatus;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public interface RegistrationService {
|
public interface RegistrationService {
|
||||||
|
|
||||||
boolean createRegistration(long userId, long registrationId);
|
boolean createRegistration(Long userId, Long registrationId);
|
||||||
|
|
||||||
boolean acceptRegistration(long userId, long RegistrationId);
|
boolean acceptRegistration(Long userId, Long RegistrationId);
|
||||||
|
|
||||||
boolean deleteRegistration(long userId, long registrationId);
|
boolean deleteRegistration(Long userId, Long registrationId);
|
||||||
|
|
||||||
|
List<RegistrationSearchResponse> searchRegistrations(Long LectureId);
|
||||||
|
|
||||||
|
RegistrationStatus isOnline(Long userId, Long lectureId);
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,20 @@
|
|||||||
package com.edufocus.edufocus.registration.service;
|
package com.edufocus.edufocus.registration.service;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.lecture.entity.Lecture;
|
||||||
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.entity.Registration;
|
||||||
|
import com.edufocus.edufocus.registration.entity.RegistrationSearchResponse;
|
||||||
import com.edufocus.edufocus.registration.entity.RegistrationStatus;
|
import com.edufocus.edufocus.registration.entity.RegistrationStatus;
|
||||||
import com.edufocus.edufocus.registration.repository.RegistrationRepository;
|
import com.edufocus.edufocus.registration.repository.RegistrationRepository;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.User;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.UserRole;
|
||||||
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.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.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@ -21,14 +27,16 @@ public class RegistrationServiceImpl implements RegistrationService {
|
|||||||
private final LectureRepository lectureRepository;
|
private final LectureRepository lectureRepository;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean createRegistration(long userId, long lectureId) {
|
public boolean createRegistration(Long userId, Long lectureId) {
|
||||||
if (registrationRepository.findByUserIdAndLectureId(userId, lectureId) != null) {
|
Optional<User> user = userRepository.findById(userId);
|
||||||
|
|
||||||
|
if (user.isEmpty() || user.get().getRole().equals(UserRole.ADMIN)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Registration registration = new Registration().builder()
|
Registration registration = new Registration().builder()
|
||||||
.user(userRepository.getReferenceById(userId))
|
.user(userRepository.findById(userId).get())
|
||||||
.lecture(lectureRepository.getReferenceById(lectureId))
|
.lecture(lectureRepository.findById(lectureId).get())
|
||||||
.status(RegistrationStatus.WAITING)
|
.status(RegistrationStatus.WAITING)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@ -37,24 +45,24 @@ public class RegistrationServiceImpl implements RegistrationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean acceptRegistration(long userId, long registrationId) {
|
public boolean acceptRegistration(Long userId, Long registrationId) {
|
||||||
Registration registration = registrationRepository.findById(registrationId).get();
|
Optional<Registration> registration = registrationRepository.findById(registrationId);
|
||||||
|
|
||||||
if (registration.getLecture().getUser().getId() != userId) {
|
if (registration.isEmpty() || registration.get().getLecture().getUser().getId() != userId) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
registration.setStatus(RegistrationStatus.valueOf("ACCEPTED"));
|
registration.get().setStatus(RegistrationStatus.valueOf("ACCEPTED"));
|
||||||
registrationRepository.save(registration);
|
registrationRepository.save(registration.get());
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean deleteRegistration(long userId, long registrationId) {
|
public boolean deleteRegistration(Long userId, Long registrationId) {
|
||||||
Registration registration = registrationRepository.findById(registrationId).get();
|
Optional<Registration> registration = registrationRepository.findById(registrationId);
|
||||||
|
|
||||||
if (registration.getLecture().getUser().getId() != userId) {
|
if (registration.isEmpty() || registration.get().getLecture().getUser().getId() != userId) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,4 +70,28 @@ public class RegistrationServiceImpl implements RegistrationService {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<RegistrationSearchResponse> searchRegistrations(Long lectureId) {
|
||||||
|
List<Registration> registrations = registrationRepository.findAllNotAcceptedByLectureId(lectureId);
|
||||||
|
|
||||||
|
List<RegistrationSearchResponse> responses = new ArrayList<>();
|
||||||
|
for (Registration registration : registrations) {
|
||||||
|
RegistrationSearchResponse response = new RegistrationSearchResponse().builder()
|
||||||
|
.id(registration.getId())
|
||||||
|
.userName(registration.getUser().getName())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
responses.add(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
return responses;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RegistrationStatus isOnline(Long userId, Long lectureId) {
|
||||||
|
|
||||||
|
Registration registration = registrationRepository.findByUserIdAndLectureId(userId, lectureId);
|
||||||
|
return registration.getStatus();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ public class SwaggerConfig {
|
|||||||
.info(new Info()
|
.info(new Info()
|
||||||
.title("에듀포커스 API")
|
.title("에듀포커스 API")
|
||||||
.description("")
|
.description("")
|
||||||
|
|
||||||
.version("1.0.0"));
|
.version("1.0.0"));
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -26,7 +26,7 @@ public class WebConfiguration implements WebMvcConfigurer {
|
|||||||
public void addCorsMappings(CorsRegistry registry) {
|
public void addCorsMappings(CorsRegistry registry) {
|
||||||
registry
|
registry
|
||||||
.addMapping("/**")
|
.addMapping("/**")
|
||||||
.allowedOrigins("http://i11a701.p.ssafy.io/", "http://localhost:5173", "http://localhost:4173")
|
.allowedOrigins("http://i11a701.p.ssafy.io/", "http://localhost:5173", "http://localhost:4173","http://localhost:5080")
|
||||||
.allowedMethods(HttpMethod.GET.name(), HttpMethod.POST.name(), HttpMethod.PUT.name(),
|
.allowedMethods(HttpMethod.GET.name(), HttpMethod.POST.name(), HttpMethod.PUT.name(),
|
||||||
HttpMethod.DELETE.name(), HttpMethod.HEAD.name(), HttpMethod.OPTIONS.name(),
|
HttpMethod.DELETE.name(), HttpMethod.HEAD.name(), HttpMethod.OPTIONS.name(),
|
||||||
HttpMethod.PATCH.name())
|
HttpMethod.PATCH.name())
|
||||||
@ -44,8 +44,6 @@ public class WebConfiguration implements WebMvcConfigurer {
|
|||||||
public void addInterceptors(InterceptorRegistry registry) {
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
registry.addInterceptor(jwtInterceptor)
|
registry.addInterceptor(jwtInterceptor)
|
||||||
.addPathPatterns("/**") // 모든 경로에 대해 인터셉터 적용
|
.addPathPatterns("/**") // 모든 경로에 대해 인터셉터 적용
|
||||||
.excludePathPatterns("/v3/api-docs/**","/swagger-resources/**","/webjars/**","/swagger-ui/**","/auth/**", "/board/**", "/user/**","/lecture/**","/qna/**", "/quiz/**"); // 인증 없이 접근 가능한 경로 설정
|
.excludePathPatterns("/v3/api-docs/**","/swagger-resources/**","/webjars/**","/swagger-ui/**","/auth/**", "/board/**", "/user/**","/lecture/**","/qna/**", "/quiz/**","/video/**","/registration/**"); // 인증 없이 접근 가능한 경로 설정
|
||||||
|
|
||||||
///v3/api-docs/**, /swagger-resources/**, /webjars/**
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,6 +1,10 @@
|
|||||||
package com.edufocus.edufocus.user.controller;
|
package com.edufocus.edufocus.user.controller;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.user.model.entity.InfoDto;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.PasswordDto;
|
||||||
import com.edufocus.edufocus.user.model.entity.User;
|
import com.edufocus.edufocus.user.model.entity.User;
|
||||||
|
import com.edufocus.edufocus.user.model.exception.ExpriedTokenException;
|
||||||
|
import com.edufocus.edufocus.user.model.exception.UnAuthorizedException;
|
||||||
import com.edufocus.edufocus.user.model.service.UserService;
|
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;
|
||||||
@ -41,48 +45,68 @@ public class UserController {
|
|||||||
return ResponseEntity.ok("임시 비밀번호가 이메일로 전송되었습니다.");
|
return ResponseEntity.ok("임시 비밀번호가 이메일로 전송되었습니다.");
|
||||||
|
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// @PostMapping("/login")
|
|
||||||
// public ResponseEntity<User> login(@RequestBody User user) {
|
|
||||||
// try {
|
|
||||||
// User loggedInUser = userService.login(user);
|
|
||||||
// return ResponseEntity.ok(loggedInUser);
|
|
||||||
//
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// throw new RuntimeException(e);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
@PutMapping("/updateinfo/{id}")
|
||||||
|
public ResponseEntity<String> updateUserInfo(
|
||||||
|
@PathVariable("id") Long id,
|
||||||
|
@RequestBody InfoDto infoDto) {
|
||||||
|
try {
|
||||||
|
userService.changeuInfo(infoDto, id);
|
||||||
|
return ResponseEntity.ok("User info updated successfully");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return ResponseEntity.badRequest().body(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 비밀번호 변경
|
||||||
|
@PutMapping("/updatepassword/{id}")
|
||||||
|
public ResponseEntity<String> updatePassword(
|
||||||
|
@PathVariable("id") Long id,
|
||||||
|
@RequestBody PasswordDto passwordDto) {
|
||||||
|
try {
|
||||||
|
userService.changePassword(passwordDto, id);
|
||||||
|
return ResponseEntity.ok("Password changed successfully");
|
||||||
|
} catch (Exception e) {
|
||||||
|
return ResponseEntity.badRequest().body(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
@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, HttpServletResponse response) {
|
@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 {
|
||||||
User loginUser = userService.login(user);
|
User loginUser = userService.login(user);
|
||||||
if (loginUser != null) {
|
if (loginUser != null) {
|
||||||
|
|
||||||
|
String name = loginUser.getName();
|
||||||
|
resultMap.put("name",name);
|
||||||
String accessToken = jwtUtil.createAccessToken(String.valueOf(loginUser.getId()));
|
String accessToken = jwtUtil.createAccessToken(String.valueOf(loginUser.getId()));
|
||||||
String refreshToken = jwtUtil.createRefreshToken(String.valueOf(loginUser.getId()));
|
String refreshToken = jwtUtil.createRefreshToken(String.valueOf(loginUser.getId()));
|
||||||
|
|
||||||
// 발급받은 refresh token 을 DB에 저장.
|
|
||||||
userService.saveRefreshToken(loginUser.getId(), refreshToken);
|
userService.saveRefreshToken(loginUser.getId(), refreshToken);
|
||||||
|
|
||||||
// JSON 으로 token 전달.
|
|
||||||
System.out.println(accessToken);
|
|
||||||
resultMap.put("access-token", accessToken);
|
|
||||||
// resultMap.put("refresh-token", refreshToken);
|
|
||||||
|
|
||||||
// 쿠키 저장
|
|
||||||
|
resultMap.put("role",loginUser.getRole());
|
||||||
|
resultMap.put("access-token", accessToken);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Cookie refreshCookie = new Cookie("refresh-token", refreshToken);
|
Cookie refreshCookie = new Cookie("refresh-token", refreshToken);
|
||||||
refreshCookie.setPath("/");
|
refreshCookie.setPath("/");
|
||||||
refreshCookie.setHttpOnly(true);
|
refreshCookie.setHttpOnly(true);
|
||||||
refreshCookie.setSecure(true); // HTTPS에서만 전송되도록 설정
|
// refreshCookie.setSecure(true); // HTTPS에서만 전송되도록 설정
|
||||||
// refreshCookie.setSameSite(Cookie.SameSite.NONE); // Cross-Origin 요청에 대해 모두 전송
|
// refreshCookie.setSameSite(Cookie.SameSite.NONE); // Cross-Origin 요청에 대해 모두 전송
|
||||||
|
|
||||||
response.addCookie(refreshCookie);
|
response.addCookie(refreshCookie);
|
||||||
|
|
||||||
// 쿠키저장
|
|
||||||
status = HttpStatus.CREATED;
|
status = HttpStatus.CREATED;
|
||||||
} else {
|
} else {
|
||||||
resultMap.put("message", "아이디 또는 패스워드를 확인해 주세요.");
|
resultMap.put("message", "아이디 또는 패스워드를 확인해 주세요.");
|
||||||
@ -100,12 +124,9 @@ public class UserController {
|
|||||||
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) {
|
||||||
//logger.debug("userId : {} ", userId);
|
|
||||||
String id = String.valueOf(userId);
|
String id = String.valueOf(userId);
|
||||||
|
|
||||||
System.out.println("!>>>>>>>>>>>>>>>>>>>>>>>>");
|
|
||||||
System.out.println(id);
|
|
||||||
System.out.println(id.getClass().getName());
|
|
||||||
Map<String, Object> resultMap = new HashMap<>();
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
HttpStatus status = HttpStatus.ACCEPTED;
|
HttpStatus status = HttpStatus.ACCEPTED;
|
||||||
if (jwtUtil.checkToken(request.getHeader("Authorization"))) {
|
if (jwtUtil.checkToken(request.getHeader("Authorization"))) {
|
||||||
@ -239,7 +260,15 @@ public class UserController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ExceptionHandler(ExpriedTokenException.class)
|
||||||
|
public ResponseEntity<?> handleExpiredTokenException(){
|
||||||
|
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
|
||||||
|
|
||||||
|
}
|
||||||
|
@ExceptionHandler(UnAuthorizedException.class)
|
||||||
|
public ResponseEntity<?> handleUnauthorizedException(){
|
||||||
|
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.edufocus.edufocus.user.model.entity;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
|
||||||
|
public class InfoDto {
|
||||||
|
|
||||||
|
String name;
|
||||||
|
String email;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.edufocus.edufocus.user.model.entity;
|
||||||
|
|
||||||
|
import lombok.Generated;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
public class PasswordDto {
|
||||||
|
|
||||||
|
String currentPassword;
|
||||||
|
String newPassword;
|
||||||
|
String newPasswordCheck;
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.edufocus.edufocus.user.model.exception;
|
||||||
|
|
||||||
|
public class ExpriedTokenException extends RuntimeException {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public ExpriedTokenException() {
|
||||||
|
super("계정 권한이 유효하지 않습니다.\n다시 로그인을 하세요.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package com.edufocus.edufocus.user.model.exception;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
|
||||||
|
@ControllerAdvice
|
||||||
|
public class GlobalExceptionHandler {
|
||||||
|
|
||||||
|
@ExceptionHandler(InvalidTokenException.class)
|
||||||
|
public ResponseEntity<String> handleUnAuthorizedException(InvalidTokenException e) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ExceptionHandler(ExpriedTokenException.class)
|
||||||
|
public ResponseEntity<String> handleInvalidTokenException(ExpriedTokenException e) {
|
||||||
|
|
||||||
|
return new ResponseEntity<>(e.getMessage(), HttpStatus.UNAUTHORIZED);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.edufocus.edufocus.user.model.exception;
|
||||||
|
|
||||||
|
public class InvalidTokenException extends RuntimeException {
|
||||||
|
public InvalidTokenException() {
|
||||||
|
super("Token is invalid");
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
package com.edufocus.edufocus.user.model.service;
|
package com.edufocus.edufocus.user.model.service;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.user.model.entity.InfoDto;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.PasswordDto;
|
||||||
import com.edufocus.edufocus.user.model.entity.User;
|
import com.edufocus.edufocus.user.model.entity.User;
|
||||||
|
|
||||||
public interface UserService {
|
public interface UserService {
|
||||||
@ -11,5 +13,8 @@ public interface UserService {
|
|||||||
User userInfo(Long id) throws Exception;
|
User userInfo(Long id) throws Exception;
|
||||||
void sendEamail(User user) throws Exception;
|
void sendEamail(User user) throws Exception;
|
||||||
void userCheck(Long id) throws Exception;
|
void userCheck(Long id) throws Exception;
|
||||||
|
String getUserName(Long id) throws Exception;
|
||||||
|
void changeuInfo(InfoDto infoDto,Long id) throws Exception;
|
||||||
|
void changePassword(PasswordDto passwordDto,Long id) throws Exception;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
package com.edufocus.edufocus.user.model.service;
|
package com.edufocus.edufocus.user.model.service;
|
||||||
|
|
||||||
|
|
||||||
import com.edufocus.edufocus.user.model.entity.MailDto;
|
import com.edufocus.edufocus.user.model.entity.*;
|
||||||
import com.edufocus.edufocus.user.model.entity.MemberChangeDto;
|
|
||||||
import com.edufocus.edufocus.user.model.entity.User;
|
|
||||||
import com.edufocus.edufocus.user.model.exception.UserException;
|
import com.edufocus.edufocus.user.model.exception.UserException;
|
||||||
import com.edufocus.edufocus.user.model.repository.UserRepository;
|
import com.edufocus.edufocus.user.model.repository.UserRepository;
|
||||||
import jakarta.transaction.Transactional;
|
import jakarta.transaction.Transactional;
|
||||||
@ -21,46 +19,41 @@ import java.util.Optional;
|
|||||||
@Service
|
@Service
|
||||||
@Transactional
|
@Transactional
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class UserServiceImpl implements UserService{
|
public class UserServiceImpl implements UserService {
|
||||||
|
|
||||||
|
|
||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
private final JavaMailSender mailSender;
|
private final JavaMailSender mailSender;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void join(User user)
|
public void join(User user)
|
||||||
{
|
{
|
||||||
|
System.out.println(user.getRole().getClass());
|
||||||
|
|
||||||
userRepository.save(user);
|
userRepository.save(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public User login(User user) throws SQLException
|
public User login(User user) throws SQLException {
|
||||||
{
|
|
||||||
Optional<User> findUser = userRepository.findByUserId(user.getUserId());
|
Optional<User> findUser = userRepository.findByUserId(user.getUserId());
|
||||||
|
|
||||||
|
|
||||||
if(findUser.isEmpty())
|
if (findUser.isEmpty()) {
|
||||||
{
|
|
||||||
throw new UserException("없는 유저");
|
throw new UserException("없는 유저");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(findUser.isPresent())
|
if (findUser.isPresent()) {
|
||||||
{
|
|
||||||
|
|
||||||
User find = findUser.get();
|
User find = findUser.get();
|
||||||
if(find.getPassword().equals(user.getPassword()))
|
if (find.getPassword().equals(user.getPassword())) {
|
||||||
{
|
|
||||||
return find;
|
return find;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
throw new UserException("비밀번호 틀림");
|
throw new UserException("비밀번호 틀림");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
throw new UserException("없는 유저");
|
throw new UserException("없는 유저");
|
||||||
|
|
||||||
|
|
||||||
@ -69,13 +62,10 @@ public class UserServiceImpl implements UserService{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public User userInfo(Long id)
|
public User userInfo(Long id) {
|
||||||
{
|
try {
|
||||||
try{
|
|
||||||
return userRepository.findById(id).get();
|
return userRepository.findById(id).get();
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
throw new UserException(e.getMessage());
|
throw new UserException(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,16 +75,15 @@ public class UserServiceImpl implements UserService{
|
|||||||
public void sendEamail(User user) throws Exception {
|
public void sendEamail(User user) throws Exception {
|
||||||
MailDto mailDto = createMailAndChargePassword(user);
|
MailDto mailDto = createMailAndChargePassword(user);
|
||||||
|
|
||||||
System.out.println("이메일 전송 완료");
|
|
||||||
SimpleMailMessage message = new SimpleMailMessage();
|
|
||||||
|
|
||||||
|
SimpleMailMessage message = new SimpleMailMessage();
|
||||||
|
|
||||||
|
|
||||||
message.setTo(mailDto.getAddress());
|
message.setTo(mailDto.getAddress());
|
||||||
message.setFrom("passfinder111@gmail.com");
|
message.setFrom("passfinder111@gmail.com");
|
||||||
message.setSubject(mailDto.getTitle());
|
message.setSubject(mailDto.getTitle());
|
||||||
message.setText(mailDto.getMessage());
|
message.setText(mailDto.getMessage());
|
||||||
System.out.println("!!!!!!!!!!!!!!!!!!"+ message);
|
|
||||||
|
|
||||||
mailSender.send(message);
|
mailSender.send(message);
|
||||||
|
|
||||||
@ -105,16 +94,14 @@ public class UserServiceImpl implements UserService{
|
|||||||
String str = getTempPassword();
|
String str = getTempPassword();
|
||||||
MailDto dto = new MailDto();
|
MailDto dto = new MailDto();
|
||||||
dto.setAddress(user.getEmail());
|
dto.setAddress(user.getEmail());
|
||||||
dto.setTitle(user.getUserId()+"님의 임시비밀번호 안내 이메일 입니다.");
|
dto.setTitle(user.getUserId() + "님의 임시비밀번호 안내 이메일 입니다.");
|
||||||
dto.setMessage("안녕하세요. EduFoucs 입니다. "+ "\n"+ "임시비밀번호 안내 관련 메일 입니다." + "\n[" + user.getName() + "]" + "님의 임시 비밀번호는 "
|
dto.setMessage("안녕하세요. EduFoucs 입니다. " + "\n" + "임시비밀번호 안내 관련 메일 입니다." + "\n[" + user.getName() + "]" + "님의 임시 비밀번호는 "
|
||||||
+ str + " 입니다.");
|
+ str + " 입니다.");
|
||||||
|
|
||||||
System.out.println(dto);
|
System.out.println(dto);
|
||||||
|
|
||||||
MemberChangeDto memberChangeDto = new MemberChangeDto(user.getId(),str);
|
MemberChangeDto memberChangeDto = new MemberChangeDto(user.getId(), str);
|
||||||
System.out.println(memberChangeDto);
|
userRepository.updatePassword(memberChangeDto.getId(), memberChangeDto.getPassword());
|
||||||
userRepository.updatePassword(memberChangeDto.getId(),memberChangeDto.getPassword());
|
|
||||||
System.out.println();
|
|
||||||
|
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
@ -125,17 +112,63 @@ public class UserServiceImpl implements UserService{
|
|||||||
User user = userRepository.findById(id).orElse(null);
|
User user = userRepository.findById(id).orElse(null);
|
||||||
|
|
||||||
|
|
||||||
if(user == null)
|
if (user == null) {
|
||||||
{
|
throw new UserException("유효하지 않은 아이디입니다. 다시 입력하세요");
|
||||||
System.out.println("불가");
|
|
||||||
throw new RuntimeException("유효하지 않은 아이디입니다. 다시 입력하세요");
|
|
||||||
|
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
sendEamail(user);
|
sendEamail(user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getUserName(Long id) throws Exception {
|
||||||
|
|
||||||
|
return userRepository.findById(id).get().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changeuInfo(InfoDto infoDto, Long id) throws Exception {
|
||||||
|
|
||||||
|
User user = userRepository.findById(id).orElse(null);
|
||||||
|
|
||||||
|
if (user == null) {
|
||||||
|
throw new Exception("User not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (infoDto.getName() != null)
|
||||||
|
{
|
||||||
|
user.setName(infoDto.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(infoDto.getEmail()!=null)
|
||||||
|
{
|
||||||
|
user.setEmail(infoDto.getEmail());
|
||||||
|
}
|
||||||
|
userRepository.save(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changePassword(PasswordDto passwordDto, Long id) throws Exception {
|
||||||
|
User user = userRepository.findById(id).orElse(null);
|
||||||
|
|
||||||
|
if (user == null) {
|
||||||
|
throw new Exception("User not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!user.getPassword().equals(passwordDto.getCurrentPassword())) {
|
||||||
|
throw new Exception("Current password is incorrect");
|
||||||
|
} else {
|
||||||
|
if (!passwordDto.getNewPassword().equals(passwordDto.getNewPasswordCheck())) {
|
||||||
|
throw new Exception("New password confirmation does not match");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
user.setPassword(passwordDto.getNewPassword());
|
||||||
|
userRepository.save(user);
|
||||||
|
}
|
||||||
public String getTempPassword() {
|
public String getTempPassword() {
|
||||||
char[] charSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
|
char[] charSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
|
||||||
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
|
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
|
||||||
|
@ -4,6 +4,8 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.user.model.exception.ExpriedTokenException;
|
||||||
|
import com.edufocus.edufocus.user.model.exception.InvalidTokenException;
|
||||||
import com.edufocus.edufocus.user.model.exception.UnAuthorizedException;
|
import com.edufocus.edufocus.user.model.exception.UnAuthorizedException;
|
||||||
import io.jsonwebtoken.*;
|
import io.jsonwebtoken.*;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
@ -52,19 +54,27 @@ public class JWTUtil {
|
|||||||
|
|
||||||
public boolean checkToken(String token) {
|
public boolean checkToken(String token) {
|
||||||
try {
|
try {
|
||||||
Jws<Claims> claims = Jwts.parserBuilder()
|
Jws<Claims> claims = Jwts.parserBuilder()
|
||||||
.setSigningKey(generateKey())
|
.setSigningKey(generateKey())
|
||||||
.build()
|
.build()
|
||||||
.parseClaimsJws(token);
|
.parseClaimsJws(token);
|
||||||
log.debug("claims: {}", claims);
|
log.debug("claims: {}", claims);
|
||||||
return true;
|
return true;
|
||||||
} catch (MalformedJwtException | UnsupportedJwtException | IllegalArgumentException | SignatureException | ExpiredJwtException e) {
|
} catch (MalformedJwtException | UnsupportedJwtException | IllegalArgumentException | SignatureException e) {
|
||||||
log.error("Token validation error: {}", e.getMessage());
|
log.error("Token validation error: {}", e.getMessage());
|
||||||
return false;
|
|
||||||
} catch (Exception e) {
|
return false;
|
||||||
System.out.println(token);
|
}
|
||||||
log.error("Unexpected error while validating token: {}", e.getMessage());
|
catch ( ExpiredJwtException e)
|
||||||
return false;
|
{
|
||||||
|
throw new ExpriedTokenException();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
System.out.println(token);
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
log.error("Unexpected error while validating token: {}", e.getMessage());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,9 +87,15 @@ public class JWTUtil {
|
|||||||
Map<String, Object> value = claims.getBody();
|
Map<String, Object> value = claims.getBody();
|
||||||
log.info("value : {}", value);
|
log.info("value : {}", value);
|
||||||
return (String) value.get("id");
|
return (String) value.get("id");
|
||||||
} catch (Exception e) {
|
}catch ( ExpiredJwtException e)
|
||||||
|
{
|
||||||
|
System.out.println("expired token");
|
||||||
|
throw new ExpriedTokenException();
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
log.error("Failed to get user ID from token: {}", e.getMessage());
|
log.error("Failed to get user ID from token: {}", e.getMessage());
|
||||||
throw new UnAuthorizedException();
|
throw new InvalidTokenException();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,44 @@
|
|||||||
package com.edufocus.edufocus.video.controller;
|
package com.edufocus.edufocus.video.controller;
|
||||||
|
|
||||||
import io.livekit.server.AccessToken;
|
|
||||||
import io.livekit.server.RoomJoin;
|
|
||||||
import io.livekit.server.RoomName;
|
|
||||||
import io.livekit.server.WebhookReceiver;
|
|
||||||
import livekit.LivekitWebhook.WebhookEvent;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@CrossOrigin(origins = "*")
|
import com.edufocus.edufocus.lecture.entity.Lecture;
|
||||||
@RestController
|
import com.edufocus.edufocus.lecture.entity.LectureDetailResponse;
|
||||||
public class Controller {
|
import com.edufocus.edufocus.lecture.repository.LectureRepository;
|
||||||
|
import com.edufocus.edufocus.lecture.service.LectureService;
|
||||||
|
import com.edufocus.edufocus.registration.entity.RegistrationStatus;
|
||||||
|
import com.edufocus.edufocus.registration.service.RegistrationService;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.User;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.UserRole;
|
||||||
|
import com.edufocus.edufocus.user.model.repository.UserRepository;
|
||||||
|
import com.edufocus.edufocus.user.model.service.UserService;
|
||||||
|
import com.edufocus.edufocus.user.util.JWTUtil;
|
||||||
|
import com.edufocus.edufocus.video.service.VideoSertvice;
|
||||||
|
import io.livekit.server.*;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import livekit.LivekitWebhook.WebhookEvent;
|
||||||
|
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/video")
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
|
||||||
|
public class Controller {
|
||||||
|
private final JWTUtil jwtUtil;
|
||||||
|
private final UserService userService;
|
||||||
|
private final LectureService lectureService;
|
||||||
|
private final VideoSertvice videoSertvice;
|
||||||
|
private final RegistrationService registrationService;
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
private final LectureRepository lectureRepository;
|
||||||
@Value("${livekit.api.key}")
|
@Value("${livekit.api.key}")
|
||||||
private String LIVEKIT_API_KEY;
|
private String LIVEKIT_API_KEY;
|
||||||
|
|
||||||
@ -25,47 +49,143 @@ public class Controller {
|
|||||||
* @param params JSON object with roomName and participantName
|
* @param params JSON object with roomName and participantName
|
||||||
* @return JSON object with the JWT token
|
* @return JSON object with the JWT token
|
||||||
*/
|
*/
|
||||||
@PostMapping(value = "/token")
|
// @PostMapping(value = "/token")
|
||||||
public ResponseEntity<Map<String, String>> createToken(@RequestBody Map<String, String> params) {
|
// public ResponseEntity<Map<String, String>> createToken(@RequestBody Map<String, String> params) {
|
||||||
String roomName = params.get("roomName");
|
// String roomName = params.get("roomName");
|
||||||
String participantName = params.get("participantName");
|
// String participantName = params.get("participantName");
|
||||||
|
//
|
||||||
|
// if (roomName == null || participantName == null) {
|
||||||
|
// return ResponseEntity.badRequest().body(Map.of("errorMessage", "roomName and participantName are required"));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
||||||
|
// token.setName(participantName);
|
||||||
|
// token.setIdentity(participantName);
|
||||||
|
// token.addGrants(new RoomJoin(true), new RoomName(roomName));
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// return ResponseEntity.ok(Map.of("token", token.toJwt()));
|
||||||
|
// }
|
||||||
|
|
||||||
//
|
@PostMapping(value = "/makeroom/{lecture_id}")
|
||||||
//
|
public ResponseEntity<String> startLecture(@PathVariable("lecture_id") Long id, HttpServletRequest request) throws Exception {
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
if (roomName == null || participantName == null) {
|
|
||||||
return ResponseEntity.badRequest().body(Map.of("errorMessage", "roomName and participantName are required"));
|
String userToken = request.getHeader("Authorization");
|
||||||
|
Long userId = Long.parseLong(jwtUtil.getUserId(userToken));
|
||||||
|
|
||||||
|
|
||||||
|
videoSertvice.startOnline(userId, id);
|
||||||
|
|
||||||
|
return new ResponseEntity<>("방만들기 성공",HttpStatus.OK);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PostMapping(value = "/joinroom/{lecture_id}")
|
||||||
|
public ResponseEntity<Map<String, String>> joinRoom(@PathVariable("lecture_id") Long id, HttpServletRequest request) throws Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
String userToken = request.getHeader("Authorization");
|
||||||
|
|
||||||
|
|
||||||
|
Long userId = Long.parseLong(jwtUtil.getUserId(userToken));
|
||||||
|
User findUser= userRepository.findById(userId).orElse(null);
|
||||||
|
Lecture lecture= lectureRepository.findById(id).orElse(null);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(findUser.getRole()==UserRole.ADMIN ){//&& lecture.isOnline() ) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
String roomName = lecture.getTitle();
|
||||||
|
String participantName = userService.getUserName(userId);
|
||||||
|
|
||||||
|
|
||||||
|
AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
||||||
|
token.setName(participantName);
|
||||||
|
token.setIdentity(participantName);
|
||||||
|
token.addGrants(new RoomJoin(true), new RoomName(roomName), new RoomCreate(true));
|
||||||
|
|
||||||
|
videoSertvice.startOnline(userId, id);
|
||||||
|
|
||||||
|
|
||||||
|
return ResponseEntity.ok(Map.of("token", token.toJwt()));
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(findUser.getRole()==UserRole.STUDENT )// && lecture.isOnline() )
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
String roomName = lecture.getTitle();
|
||||||
|
String participantName = userService.getUserName(userId);
|
||||||
|
|
||||||
|
|
||||||
|
AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
||||||
|
token.setName(participantName);
|
||||||
|
token.setIdentity(participantName);
|
||||||
|
token.addGrants(new RoomJoin(true), new RoomName(roomName));
|
||||||
|
|
||||||
|
|
||||||
|
videoSertvice.startOnline(userId, id);
|
||||||
|
|
||||||
|
|
||||||
|
return ResponseEntity.ok(Map.of("token", token.toJwt()));
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
|
||||||
|
return ResponseEntity.ok(Map.of("token", null));
|
||||||
|
|
||||||
|
// String userToken = request.getHeader("Authorization");
|
||||||
|
//
|
||||||
|
// Long userId = Long.parseLong(jwtUtil.getUserId(userToken));
|
||||||
|
// LectureDetailResponse lecture= lectureService.findLectureById(userId,id);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// //RegistrationStatus registrationStatus = registrationService.isOnline(userId,id);
|
||||||
|
//
|
||||||
|
// if(registrationStatus==RegistrationStatus.ACCEPTED)
|
||||||
|
// {
|
||||||
|
// String roomName = lecture.getTitle();
|
||||||
|
// String participantName = userService.getUserName(userId);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// AccessToken token = new AccessToken(LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
||||||
|
// token.setName(participantName);
|
||||||
|
// token.setIdentity(participantName);
|
||||||
|
// token.addGrants(new RoomJoin(true), new RoomName(roomName));
|
||||||
|
//
|
||||||
|
// //videoSertvice.startOnline(userId,id);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// return ResponseEntity.ok(Map.of("token", token.toJwt()));
|
||||||
|
// }
|
||||||
|
// else{
|
||||||
|
// return ResponseEntity.status(HttpStatus.FORBIDDEN).body(Map.of("errorMessage", "Not accepted"));
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
token.setName(participantName);
|
|
||||||
token.setIdentity(participantName);
|
|
||||||
token.addGrants(new RoomJoin(true), new RoomName(roomName));
|
|
||||||
|
|
||||||
// 방이름으로 입장하는건데
|
|
||||||
// 만약 수강생에 DB에 신청한 강의명이 없다면 들어갈수 없음
|
|
||||||
// 검증 로직만 추가하면 될듯?
|
|
||||||
|
|
||||||
|
|
||||||
return ResponseEntity.ok(Map.of("token", token.toJwt()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(value = "/webhook", consumes = "application/webhook+json")
|
@PostMapping(value = "/livekit/webhook", consumes = "application/webhook+json")
|
||||||
public ResponseEntity<String> receiveWebhook(@RequestHeader("Authorization") String authHeader, @RequestBody String body) {
|
public ResponseEntity<String> receiveWebhook(@RequestHeader("Authorization") String authHeader, @RequestBody String body) {
|
||||||
WebhookReceiver webhookReceiver = new WebhookReceiver(LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
WebhookReceiver webhookReceiver = new WebhookReceiver(LIVEKIT_API_KEY, LIVEKIT_API_SECRET);
|
||||||
try {
|
try {
|
||||||
WebhookEvent event = webhookReceiver.receive(body, authHeader);
|
WebhookEvent event = webhookReceiver.receive(body, authHeader);
|
||||||
System.out.println("LiveKit Webhook: " + event.toString());
|
System.out.println("LiveKit Webhook: " + event.toString());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("Error validating webhook event: " + e.getMessage());
|
System.err.println("Error validating webhook event: " + e.getMessage());
|
||||||
}
|
}
|
||||||
return ResponseEntity.ok("ok");
|
return ResponseEntity.ok("ok");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.edufocus.edufocus.video.service;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public interface VideoSertvice {
|
||||||
|
|
||||||
|
void startOnline(Long userId,Long lectureId) throws SQLException;
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package com.edufocus.edufocus.video.service;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.lecture.entity.Lecture;
|
||||||
|
import com.edufocus.edufocus.lecture.service.LectureService;
|
||||||
|
import jakarta.transaction.Transactional;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.sql.SQLException;
|
||||||
|
@Service
|
||||||
|
@Transactional
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class VideoServiceImpl implements VideoSertvice{
|
||||||
|
|
||||||
|
private final LectureService lectureService;
|
||||||
|
@Override
|
||||||
|
public void startOnline(Long userId,Long lectureId) throws SQLException {
|
||||||
|
|
||||||
|
lectureService.changeState(lectureId);
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,9 @@ server.port=8080
|
|||||||
server.ssl.enabled=false
|
server.ssl.enabled=false
|
||||||
server.servlet.context-path=${CONTEXT_PATH}
|
server.servlet.context-path=${CONTEXT_PATH}
|
||||||
|
|
||||||
|
# openvidu
|
||||||
|
#server.port=${SERVER_PORT:6080}
|
||||||
|
|
||||||
|
|
||||||
# LiveKit configuration
|
# LiveKit configuration
|
||||||
livekit.api.key=${LIVEKIT_API_KEY:devkey}
|
livekit.api.key=${LIVEKIT_API_KEY:devkey}
|
||||||
@ -28,6 +31,8 @@ spring.jpa.hibernate.ddl-auto=create
|
|||||||
spring.jpa.show-sql=true
|
spring.jpa.show-sql=true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spring.mail.host=smtp.gmail.com
|
spring.mail.host=smtp.gmail.com
|
||||||
spring.mail.port=587
|
spring.mail.port=587
|
||||||
#spring.mail.username=ssafytestpjt
|
#spring.mail.username=ssafytestpjt
|
||||||
|
@ -0,0 +1,185 @@
|
|||||||
|
package com.edufocus.edufocus.user.model.service;
|
||||||
|
|
||||||
|
import com.edufocus.edufocus.user.model.entity.PasswordDto;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.User;
|
||||||
|
import com.edufocus.edufocus.user.model.entity.UserRole;
|
||||||
|
import com.edufocus.edufocus.user.model.exception.UserException;
|
||||||
|
import com.edufocus.edufocus.user.model.repository.UserRepository;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.mockito.InjectMocks;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.springframework.mail.javamail.JavaMailSender;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
public class UserServiceImplTest {
|
||||||
|
|
||||||
|
@InjectMocks
|
||||||
|
private UserServiceImpl userService;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private UserRepository userRepository;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void setup() {
|
||||||
|
MockitoAnnotations.openMocks(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJoin() {
|
||||||
|
User user = new User();
|
||||||
|
user.setUserId("testUser");
|
||||||
|
user.setPassword("password");
|
||||||
|
user.setEmail("test@example.com");
|
||||||
|
user.setRole(UserRole.STUDENT);
|
||||||
|
user.setId(1L);
|
||||||
|
|
||||||
|
|
||||||
|
userService.join(user);
|
||||||
|
|
||||||
|
verify(userRepository, times(1)).save(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLogin_Success() throws Exception {
|
||||||
|
User user = new User();
|
||||||
|
user.setUserId("testUser");
|
||||||
|
user.setPassword("password");
|
||||||
|
|
||||||
|
when(userRepository.findByUserId("testUser")).thenReturn(Optional.of(user));
|
||||||
|
|
||||||
|
User loggedInUser = userService.login(user);
|
||||||
|
|
||||||
|
assertNotNull(loggedInUser);
|
||||||
|
assertEquals("testUser", loggedInUser.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLogin_UserNotFound() {
|
||||||
|
User user = new User();
|
||||||
|
user.setUserId("testUser");
|
||||||
|
user.setPassword("password");
|
||||||
|
|
||||||
|
when(userRepository.findByUserId("testUser")).thenReturn(Optional.empty());
|
||||||
|
|
||||||
|
assertThrows(UserException.class, () -> {
|
||||||
|
userService.login(user);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testLogin_InvalidPassword() {
|
||||||
|
User user = new User();
|
||||||
|
user.setUserId("testUser");
|
||||||
|
user.setPassword("password");
|
||||||
|
|
||||||
|
User storedUser = new User();
|
||||||
|
storedUser.setUserId("testUser");
|
||||||
|
storedUser.setPassword("wrongPassword");
|
||||||
|
|
||||||
|
when(userRepository.findByUserId("testUser")).thenReturn(Optional.of(storedUser));
|
||||||
|
|
||||||
|
assertThrows(UserException.class, () -> {
|
||||||
|
userService.login(user);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Test
|
||||||
|
// public void testUserInfo_Success() {
|
||||||
|
// User user = new User();
|
||||||
|
// user.setId(1L);
|
||||||
|
// user.setName("testUser");
|
||||||
|
//
|
||||||
|
// when(userRepository.findById(1L)).thenReturn(Optional.of(user));
|
||||||
|
//
|
||||||
|
// User userInfo = userService.userInfo(1L);
|
||||||
|
//
|
||||||
|
// assertNotNull(userInfo);
|
||||||
|
// assertEquals("testUser", userInfo.getName());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Test
|
||||||
|
// public void testUserInfo_UserNotFound() {
|
||||||
|
// when(userRepository.findById(1L)).thenReturn(Optional.empty());
|
||||||
|
//
|
||||||
|
// assertThrows(UserException.class, () -> {
|
||||||
|
// userService.userInfo(1L);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Test
|
||||||
|
// public void testChangePassword_Success() throws Exception {
|
||||||
|
// User user = new User();
|
||||||
|
// user.setId(1L);
|
||||||
|
// user.setPassword("currentPassword");
|
||||||
|
//
|
||||||
|
// when(userRepository.findById(1L)).thenReturn(Optional.of(user));
|
||||||
|
//
|
||||||
|
// PasswordDto passwordDto = new PasswordDto();
|
||||||
|
// passwordDto.setCurrentPassword("currentPassword");
|
||||||
|
// passwordDto.setNewPassword("newPassword");
|
||||||
|
// passwordDto.setNewPasswordCheck("newPassword");
|
||||||
|
//
|
||||||
|
// userService.changePassword(passwordDto, 1L);
|
||||||
|
//
|
||||||
|
// verify(userRepository, times(1)).save(user);
|
||||||
|
// assertEquals("newPassword", user.getPassword());
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Test
|
||||||
|
// public void testChangePassword_UserNotFound() {
|
||||||
|
// when(userRepository.findById(1L)).thenReturn(Optional.empty());
|
||||||
|
//
|
||||||
|
// PasswordDto passwordDto = new PasswordDto();
|
||||||
|
// passwordDto.setCurrentPassword("currentPassword");
|
||||||
|
// passwordDto.setNewPassword("newPassword");
|
||||||
|
// passwordDto.setNewPasswordCheck("newPassword");
|
||||||
|
//
|
||||||
|
// assertThrows(Exception.class, () -> {
|
||||||
|
// userService.changePassword(passwordDto, 1L);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Test
|
||||||
|
// public void testChangePassword_InvalidCurrentPassword() {
|
||||||
|
// User user = new User();
|
||||||
|
// user.setId(1L);
|
||||||
|
// user.setPassword("currentPassword");
|
||||||
|
//
|
||||||
|
// when(userRepository.findById(1L)).thenReturn(Optional.of(user));
|
||||||
|
//
|
||||||
|
// PasswordDto passwordDto = new PasswordDto();
|
||||||
|
// passwordDto.setCurrentPassword("wrongPassword");
|
||||||
|
// passwordDto.setNewPassword("newPassword");
|
||||||
|
// passwordDto.setNewPasswordCheck("newPassword");
|
||||||
|
//
|
||||||
|
// assertThrows(Exception.class, () -> {
|
||||||
|
// userService.changePassword(passwordDto, 1L);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Test
|
||||||
|
// public void testChangePassword_NewPasswordMismatch() {
|
||||||
|
// User user = new User();
|
||||||
|
// user.setId(1L);
|
||||||
|
// user.setPassword("currentPassword");
|
||||||
|
//
|
||||||
|
// when(userRepository.findById(1L)).thenReturn(Optional.of(user));
|
||||||
|
//
|
||||||
|
// PasswordDto passwordDto = new PasswordDto();
|
||||||
|
// passwordDto.setCurrentPassword("currentPassword");
|
||||||
|
// passwordDto.setNewPassword("newPassword");
|
||||||
|
// passwordDto.setNewPasswordCheck("mismatchNewPassword");
|
||||||
|
//
|
||||||
|
// assertThrows(Exception.class, () -> {
|
||||||
|
// userService.changePassword(passwordDto, 1L);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user