From 14fac8f2a6fe2ee2c98fe60f82f425f37223f658 Mon Sep 17 00:00:00 2001 From: DaeunSon <130820902+DaeunSon@users.noreply.github.com> Date: Thu, 26 Jun 2025 00:07:48 +0900 Subject: [PATCH 1/2] Update SejongLoginService.java --- .../enjoy/service/loginService/SejongLoginService.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java b/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java index b08fcc5..ff63eb3 100644 --- a/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java +++ b/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java @@ -35,7 +35,7 @@ public class SejongLoginService { public MemberDto login(MemberCommand memberCommand){ SejongMemberInfo info = sejongPortalLoginService.getMemberAuthInfos(memberCommand.getSejongPortalId(), memberCommand.getSejongPortalPassword()); - updateUserInfo(info.getStudentId(), info.getName(), info.getMajor(), info.getGrade(), info.getCompletedSemester()); //로그인 시 유저 정보 DB에 저장 + return MemberDto.builder() .major(info.getMajor()) .studentIdString(info.getStudentId()) @@ -45,14 +45,6 @@ public MemberDto login(MemberCommand memberCommand){ .build(); } - private void updateUserInfo(String studentId, String username, String major, String grade, String completedSemester) { - User user = userRepository.findByStudentId(studentId) - .orElseThrow(() -> new CustomException(ErrorCode.USER_NOT_FOUND)); - - user.updateUserInfo(studentId, username, major, grade, completedSemester); - userRepository.save(user); - } - public MemberDto getMemberAuthInfos(MemberCommand memberCommand) throws IOException { try { SejongMemberInfo info = sejongPortalLoginService.getMemberAuthInfos(memberCommand.getSejongPortalId(), memberCommand.getSejongPortalPassword()); From b24b2f44af8212956b5faccc56a502806c9cfe8d Mon Sep 17 00:00:00 2001 From: DaeunSon <130820902+DaeunSon@users.noreply.github.com> Date: Thu, 26 Jun 2025 01:37:49 +0900 Subject: [PATCH 2/2] Feat --- .../controller/FavoriteCourseController.java | 46 +++++++++++++++++++ .../enjoy/controller/UserController.java | 7 +++ .../example/enjoy/dto/FavoriteCourseDto.java | 21 +++++++++ .../example/enjoy/dto/loginDto/MemberDto.java | 2 +- .../example/enjoy/entity/FavoriteCourse.java | 15 ++++-- .../repository/FavoriteCourseRepository.java | 4 +- .../repository/TrackCourseRepository.java | 4 ++ .../enjoy/repository/UserRepository.java | 1 + .../enjoy/service/FavoriteCourseService.java | 30 +++++++----- .../loginService/SejongLoginService.java | 14 ++++++ .../service/userService/UserService.java | 21 +++++++++ 11 files changed, 149 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/example/enjoy/controller/FavoriteCourseController.java create mode 100644 src/main/java/com/example/enjoy/dto/FavoriteCourseDto.java diff --git a/src/main/java/com/example/enjoy/controller/FavoriteCourseController.java b/src/main/java/com/example/enjoy/controller/FavoriteCourseController.java new file mode 100644 index 0000000..a45067d --- /dev/null +++ b/src/main/java/com/example/enjoy/controller/FavoriteCourseController.java @@ -0,0 +1,46 @@ +package com.example.enjoy.controller; + +import com.example.enjoy.dto.FavoriteCourseDto; +import com.example.enjoy.entity.FavoriteCourse; +import com.example.enjoy.service.FavoriteCourseService; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/favorite-courses") +@RequiredArgsConstructor +public class FavoriteCourseController { + private final FavoriteCourseService favoriteCourseService; + + @Operation(summary = "즐겨찾는 과목 추가", description = "학생의 즐겨찾는 과목을 추가합니다.") + @PostMapping("/add") + public ResponseEntity addFavoriteCourse( + @RequestParam String courseName, + @RequestParam String studentId) { + + favoriteCourseService.addFavoriteCourse(studentId, courseName); + return ResponseEntity.ok().build(); + } + + @Operation(summary = "즐겨찾는 과목 조회", description = "학생의 즐겨찾는 과목을 조회합니다.") + @GetMapping("/get") + public ResponseEntity> getFavoriteCourse( + @RequestParam String studentId) { + + List favoriteCourses = favoriteCourseService.getFavoriteCourses(studentId); + if (favoriteCourses == null || favoriteCourses.isEmpty()) { + return ResponseEntity.notFound().build(); + } + + List favoriteDtos = favoriteCourses.stream() + .map(FavoriteCourseDto::from) + .collect(Collectors.toList()); + + return ResponseEntity.ok(favoriteDtos); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/enjoy/controller/UserController.java b/src/main/java/com/example/enjoy/controller/UserController.java index 080a590..652ef00 100644 --- a/src/main/java/com/example/enjoy/controller/UserController.java +++ b/src/main/java/com/example/enjoy/controller/UserController.java @@ -117,5 +117,12 @@ public ResponseEntity updateCourseStatus( userService.updateCourseStatus(studentId, courseName, newStatus); return ResponseEntity.ok().build(); } + + @Operation(summary = "유저 정보 저장", description = "학생의 정보를 저장합니다.") + @PostMapping("/save") + public ResponseEntity saveUserInfo(@Valid @RequestBody MemberDto memberDto) { + userService.saveUserInfo(memberDto); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/com/example/enjoy/dto/FavoriteCourseDto.java b/src/main/java/com/example/enjoy/dto/FavoriteCourseDto.java new file mode 100644 index 0000000..9a524a4 --- /dev/null +++ b/src/main/java/com/example/enjoy/dto/FavoriteCourseDto.java @@ -0,0 +1,21 @@ +package com.example.enjoy.dto; + +import com.example.enjoy.entity.FavoriteCourse; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class FavoriteCourseDto { + private Long id; + private String courseName; + private String studentId; + + public static FavoriteCourseDto from(FavoriteCourse favoriteCourse) { + return new FavoriteCourseDto( + favoriteCourse.getId(), + favoriteCourse.getCourseName(), + favoriteCourse.getUser().getStudentId() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/enjoy/dto/loginDto/MemberDto.java b/src/main/java/com/example/enjoy/dto/loginDto/MemberDto.java index c18a4d5..933c2ad 100644 --- a/src/main/java/com/example/enjoy/dto/loginDto/MemberDto.java +++ b/src/main/java/com/example/enjoy/dto/loginDto/MemberDto.java @@ -11,5 +11,5 @@ public class MemberDto { private String studentName; private String grade; private String completedSemester; - + private boolean hasLoginHistory; // 로그인 이력 여부 } diff --git a/src/main/java/com/example/enjoy/entity/FavoriteCourse.java b/src/main/java/com/example/enjoy/entity/FavoriteCourse.java index f88bc52..192b805 100644 --- a/src/main/java/com/example/enjoy/entity/FavoriteCourse.java +++ b/src/main/java/com/example/enjoy/entity/FavoriteCourse.java @@ -3,12 +3,14 @@ import com.example.enjoy.entity.user.User; import com.example.enjoy.util.BaseEntity; import jakarta.persistence.*; +import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; @Entity @Setter +@Getter public class FavoriteCourse extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -18,8 +20,15 @@ public class FavoriteCourse extends BaseEntity { @JoinColumn(name = "user_id") private User user; - @ManyToOne - @JoinColumn(name = "track_course_id") - private TrackCourse trackCourse; + @JoinColumn(name = "course_name") + private String courseName; + + public FavoriteCourse() { + + } + public FavoriteCourse(User user, String courseName) { + this.user = user; + this.courseName = courseName; + } } diff --git a/src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java b/src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java index 3e85f7a..e73dda4 100644 --- a/src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java +++ b/src/main/java/com/example/enjoy/repository/FavoriteCourseRepository.java @@ -6,9 +6,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository public interface FavoriteCourseRepository extends JpaRepository { - Optional findByUserAndTrackCourse(User user, TrackCourse trackCourse); + Optional findByUserAndCourseName(User user, String courseName); + List findAllByUser(User user); } diff --git a/src/main/java/com/example/enjoy/repository/TrackCourseRepository.java b/src/main/java/com/example/enjoy/repository/TrackCourseRepository.java index f314330..3fc0e3e 100644 --- a/src/main/java/com/example/enjoy/repository/TrackCourseRepository.java +++ b/src/main/java/com/example/enjoy/repository/TrackCourseRepository.java @@ -6,8 +6,12 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; + @Repository public interface TrackCourseRepository extends JpaRepository { List findAllByTrack(Track track); + + Optional findByCourseName(String courseName); } \ No newline at end of file diff --git a/src/main/java/com/example/enjoy/repository/UserRepository.java b/src/main/java/com/example/enjoy/repository/UserRepository.java index 9855820..0dacf04 100644 --- a/src/main/java/com/example/enjoy/repository/UserRepository.java +++ b/src/main/java/com/example/enjoy/repository/UserRepository.java @@ -9,4 +9,5 @@ @Repository public interface UserRepository extends JpaRepository { Optional findByStudentId(String studentId); + boolean existsByStudentId(String studentId); } \ No newline at end of file diff --git a/src/main/java/com/example/enjoy/service/FavoriteCourseService.java b/src/main/java/com/example/enjoy/service/FavoriteCourseService.java index d1b50fe..5c47c66 100644 --- a/src/main/java/com/example/enjoy/service/FavoriteCourseService.java +++ b/src/main/java/com/example/enjoy/service/FavoriteCourseService.java @@ -10,6 +10,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; @Service @@ -20,22 +21,29 @@ public class FavoriteCourseService { private final UserRepository userRepository; @Transactional - public void toggleFavoriteCourse(Long userId, Long trackCourseId) { - User user = userRepository.findById(userId) + public void addFavoriteCourse(String studentId, String courseName) { + User user = userRepository.findByStudentId(studentId) .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); - TrackCourse trackCourse = trackCourseRepository.findById(trackCourseId) + + + TrackCourse trackCourse = trackCourseRepository.findByCourseName(courseName) .orElseThrow(() -> new RuntimeException("과목을 찾을 수 없습니다.")); - Optional existingFavorite = favoriteCourseRepository - .findByUserAndTrackCourse(user, trackCourse); + // 이미 즐겨찾기한 과목인지 확인 + boolean alreadyExists = favoriteCourseRepository + .findByUserAndCourseName(user, courseName) + .isPresent(); - if (existingFavorite.isPresent()) { - favoriteCourseRepository.delete(existingFavorite.get()); - } else { - FavoriteCourse favoriteCourse = new FavoriteCourse(); - favoriteCourse.setUser(user); - favoriteCourse.setTrackCourse(trackCourse); + if (!alreadyExists) { + FavoriteCourse favoriteCourse = new FavoriteCourse(user, trackCourse.getCourseName()); favoriteCourseRepository.save(favoriteCourse); } } + + public List getFavoriteCourses(String studentId) { + User user = userRepository.findByStudentId(studentId) + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다.")); + + return favoriteCourseRepository.findAllByUser(user); + } } diff --git a/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java b/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java index ff63eb3..746e882 100644 --- a/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java +++ b/src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java @@ -34,14 +34,28 @@ public class SejongLoginService { private final UserRepository userRepository; public MemberDto login(MemberCommand memberCommand){ + boolean hasLoginHistory = userRepository.existsByStudentId(memberCommand.getSejongPortalId()); SejongMemberInfo info = sejongPortalLoginService.getMemberAuthInfos(memberCommand.getSejongPortalId(), memberCommand.getSejongPortalPassword()); + // 로그인 성공 시 사용자 정보 저장 (첫 로그인인 경우) + if (!hasLoginHistory) { + User newUser = User.builder() + .major(info.getMajor()) + .studentId(info.getStudentId()) + .username(info.getName()) + .grade(info.getGrade()) + .completedSemester(info.getCompletedSemester()) + .build(); + userRepository.save(newUser); + } + return MemberDto.builder() .major(info.getMajor()) .studentIdString(info.getStudentId()) .studentName(info.getName()) .grade(info.getGrade()) .completedSemester(info.getCompletedSemester()) + .hasLoginHistory(hasLoginHistory) .build(); } diff --git a/src/main/java/com/example/enjoy/service/userService/UserService.java b/src/main/java/com/example/enjoy/service/userService/UserService.java index f7e91e2..8677ed1 100644 --- a/src/main/java/com/example/enjoy/service/userService/UserService.java +++ b/src/main/java/com/example/enjoy/service/userService/UserService.java @@ -3,12 +3,15 @@ import com.amazonaws.services.cloudformation.model.AlreadyExistsException; import com.example.enjoy.dto.AddManualCourseRequest; import com.example.enjoy.dto.StudentCourseStatus; +import com.example.enjoy.dto.loginDto.MemberDto; import com.example.enjoy.entity.StudentCourse; import com.example.enjoy.entity.Track; import com.example.enjoy.entity.TrackCourse; +import com.example.enjoy.entity.user.User; import com.example.enjoy.repository.StudentCourseRepository; import com.example.enjoy.repository.TrackCourseRepository; import com.example.enjoy.repository.TrackRepository; +import com.example.enjoy.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -26,6 +29,7 @@ public class UserService { private final StudentCourseRepository studentCourseRepository; private final TrackRepository trackRepository; private final TrackCourseRepository trackCourseRepository; + private final UserRepository userRepository; @Transactional public void addManualCourse(AddManualCourseRequest request) { //수동으로 과목 등록 @@ -53,6 +57,23 @@ public List getManualCourses(String studentId) { //수동 등록 return manualCourses; } + @Transactional + public void saveUserInfo(MemberDto memberDto) { + User user = userRepository.findByStudentId(memberDto.getStudentIdString()) + .orElse(new User()); + + user.updateUserInfo( + memberDto.getStudentIdString(), + memberDto.getStudentName(), + memberDto.getMajor(), + memberDto.getGrade(), + memberDto.getCompletedSemester() + ); + + userRepository.save(user); + } + + @Transactional public void removeManualCourse(String studentId, String courseName) { //수동 등록 과목 삭제