Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<Void> addFavoriteCourse(
@RequestParam String courseName,
@RequestParam String studentId) {

favoriteCourseService.addFavoriteCourse(studentId, courseName);
return ResponseEntity.ok().build();
}

@Operation(summary = "즐겨찾는 과목 조회", description = "학생의 즐겨찾는 과목을 조회합니다.")
@GetMapping("/get")
public ResponseEntity<List<FavoriteCourseDto>> getFavoriteCourse(
@RequestParam String studentId) {

List<FavoriteCourse> favoriteCourses = favoriteCourseService.getFavoriteCourses(studentId);
if (favoriteCourses == null || favoriteCourses.isEmpty()) {
return ResponseEntity.notFound().build();
}

List<FavoriteCourseDto> favoriteDtos = favoriteCourses.stream()
.map(FavoriteCourseDto::from)
.collect(Collectors.toList());

return ResponseEntity.ok(favoriteDtos);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -117,5 +117,12 @@ public ResponseEntity<Void> updateCourseStatus(
userService.updateCourseStatus(studentId, courseName, newStatus);
return ResponseEntity.ok().build();
}

@Operation(summary = "유저 정보 저장", description = "학생의 정보를 저장합니다.")
@PostMapping("/save")
public ResponseEntity<MemberDto> saveUserInfo(@Valid @RequestBody MemberDto memberDto) {
userService.saveUserInfo(memberDto);
return ResponseEntity.ok().build();
}
}

21 changes: 21 additions & 0 deletions src/main/java/com/example/enjoy/dto/FavoriteCourseDto.java
Original file line number Diff line number Diff line change
@@ -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()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ public class MemberDto {
private String studentName;
private String grade;
private String completedSemester;

private boolean hasLoginHistory; // 로그인 이력 여부
}
15 changes: 12 additions & 3 deletions src/main/java/com/example/enjoy/entity/FavoriteCourse.java
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<FavoriteCourse, Long> {
Optional<FavoriteCourse> findByUserAndTrackCourse(User user, TrackCourse trackCourse);
Optional<FavoriteCourse> findByUserAndCourseName(User user, String courseName);
List<FavoriteCourse> findAllByUser(User user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,12 @@
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface TrackCourseRepository extends JpaRepository<TrackCourse, Long> {

List<TrackCourse> findAllByTrack(Track track);

Optional<TrackCourse> findByCourseName(String courseName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@
@Repository
public interface UserRepository extends JpaRepository<User,Long> {
Optional<User> findByStudentId(String studentId);
boolean existsByStudentId(String studentId);
}
30 changes: 19 additions & 11 deletions src/main/java/com/example/enjoy/service/FavoriteCourseService.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
Expand All @@ -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<FavoriteCourse> 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<FavoriteCourse> getFavoriteCourses(String studentId) {
User user = userRepository.findByStudentId(studentId)
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));

return favoriteCourseRepository.findAllByUser(user);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,25 +34,31 @@ 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());
updateUserInfo(info.getStudentId(), info.getName(), info.getMajor(), info.getGrade(), info.getCompletedSemester()); //로그인 시 유저 정보 DB에 저장

// 로그인 성공 시 사용자 정보 저장 (첫 로그인인 경우)
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();
}

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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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) { //수동으로 과목 등록
Expand Down Expand Up @@ -53,6 +57,23 @@ public List<StudentCourse> 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) { //수동 등록 과목 삭제
Expand Down
Loading