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,59 @@
package com.example.enjoy.controller;

import com.example.enjoy.dto.TrackDetailDto;
import com.example.enjoy.dto.UserTrackResponse;
import com.example.enjoy.entity.Track;
import com.example.enjoy.entity.UserTrack;
import com.example.enjoy.entity.user.User;
import com.example.enjoy.service.UserTrackService;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/user-track")
public class UserTrackController {
private final UserTrackService userTrackService;

public UserTrackController(UserTrackService userTrackService) {
this.userTrackService = userTrackService;
}

@Operation(summary = "사용자 관심 트랙 추가", description = "사용자가 관심 트랙을 추가합니다.")
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<UserTrackResponse> addUserTrack(
@RequestParam String studentId,
@RequestParam String trackName) {
UserTrack savedUserTrack = userTrackService.addUserTrack(studentId, trackName);
UserTrackResponse response = UserTrackResponse.from(savedUserTrack);
return ResponseEntity.ok(response);
}

@Operation(summary = "사용자 관심 트랙 조회", description = "사용자가 추가한 관심 트랙 목록을 조회합니다.")
@GetMapping("/{studentId}")
public ResponseEntity<List<TrackDetailDto>> getUserTracks(
@PathVariable String studentId) {
List<Track> tracks = userTrackService.getUserTracks(studentId);
if (tracks.isEmpty()) {
return ResponseEntity.noContent().build();
}
else{
List<TrackDetailDto> trackDetails = tracks.stream()
.map(track -> new TrackDetailDto().from(track))
.toList();
return ResponseEntity.ok(trackDetails);
}
}

@Operation(summary = "사용자 관심 트랙 삭제", description = "사용자가 추가한 관심 트랙을 삭제합니다.")
@DeleteMapping
public ResponseEntity<Void> removeUserTrack(
@RequestParam String studentId,
@RequestParam String trackName) {
userTrackService.removeUserTrack(studentId, trackName);
return ResponseEntity.ok().build();
}
}
8 changes: 8 additions & 0 deletions src/main/java/com/example/enjoy/dto/TrackDetailDto.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.enjoy.dto;

import com.example.enjoy.entity.Track;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
Expand All @@ -16,4 +17,11 @@ public class TrackDetailDto {
private String department;
private String description; // 트랙에 대한 설명 추가
private List<CourseStatusDto> courses; // 트랙에 포함된 과목 목록

public TrackDetailDto from (Track track) {
this.trackId = track.getId();
this.trackName = track.getName();
this.department = track.getDepartment();
return this;
}
}
22 changes: 22 additions & 0 deletions src/main/java/com/example/enjoy/dto/UserTrackResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.example.enjoy.dto;

import com.example.enjoy.entity.FavoriteCourse;
import com.example.enjoy.entity.UserTrack;
import lombok.*;

import java.time.LocalDateTime;

@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserTrackResponse {
private String studentId;
private String trackName;

public static UserTrackResponse from(UserTrack userTrack) {
return new UserTrackResponse(
userTrack.getUser().getStudentId(),
userTrack.getTrack().getName()
);
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/example/enjoy/entity/Track.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@ public class Track {

@OneToMany(mappedBy = "track", cascade = CascadeType.ALL)
private List<TrackCourse> courses = new ArrayList<>();

@OneToMany(mappedBy = "track", cascade = CascadeType.ALL)
private List<UserTrack> userTracks = new ArrayList<>();

public void addUserTrack(UserTrack userTrack) {
userTracks.add(userTrack);
userTrack.setTrack(this);
}


// public void addCourse(TrackCourse course) {
// courses.add(course);
// course.setTrack(this);
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/com/example/enjoy/entity/UserTrack.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.enjoy.entity;

import com.example.enjoy.entity.user.User;
import com.example.enjoy.util.BaseEntity;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
public class UserTrack extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "track_id")
private Track track;

}
7 changes: 7 additions & 0 deletions src/main/java/com/example/enjoy/entity/user/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

import com.example.enjoy.entity.BaseTimeEntity;

import com.example.enjoy.entity.UserTrack;
import jakarta.persistence.*;
import lombok.*;

import java.util.ArrayList;
import java.util.List;

@Builder
@Entity
@Getter
Expand All @@ -31,6 +35,9 @@ public class User extends BaseTimeEntity {
@Column(nullable = false)
private String completedSemester;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<UserTrack> userTracks = new ArrayList<>();

public void updateUserInfo(String studentId, String username, String major, String grade, String completedSemester) {
this.studentId = studentId;
this.username = username;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@ public interface TrackRepository extends JpaRepository<Track, Long> {
*/
@Query("SELECT t FROM Track t JOIN FETCH t.courses WHERE t.id = :trackId")
Optional<Track> findByIdWithCourses(@Param("trackId") Long trackId);

Optional<Track> findByName(String name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.enjoy.repository;

import com.example.enjoy.entity.Track;
import com.example.enjoy.entity.UserTrack;
import com.example.enjoy.entity.user.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

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

@Repository
public interface UserTrackRepository extends JpaRepository<UserTrack, Long> {

List<UserTrack> findAllByUser(User user);

Optional<UserTrack> findByUserAndTrack(User user, Track track);
}
68 changes: 68 additions & 0 deletions src/main/java/com/example/enjoy/service/UserTrackService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.example.enjoy.service;

import com.example.enjoy.entity.Track;
import com.example.enjoy.entity.UserTrack;
import com.example.enjoy.entity.user.User;
import com.example.enjoy.repository.TrackRepository;
import com.example.enjoy.repository.UserRepository;
import com.example.enjoy.repository.UserTrackRepository;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class UserTrackService {

private final TrackRepository trackRepository;
private final UserRepository userRepository;
private final UserTrackRepository userTrackRepository;

public UserTrackService(TrackRepository trackRepository, UserRepository userRepository, UserTrackRepository userTrackRepository) {
this.trackRepository = trackRepository;
this.userRepository = userRepository;
this.userTrackRepository = userTrackRepository;
}

public UserTrack addUserTrack(String studentId, String trackName) {
User user = userRepository.findByStudentId(studentId)
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));

Track track = trackRepository.findByName(trackName)
.orElseThrow(() -> new RuntimeException("트랙을 찾을 수 없습니다."));

UserTrack userTrack = new UserTrack();
userTrack.setUser(user);
userTrack.setTrack(track);

userTrackRepository.save(userTrack);
return userTrack;
}

public List<Track> getUserTracks(String studentId) {
User user = userRepository.findByStudentId(studentId)
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));

return userTrackRepository.findAllByUser(user)
.stream()
.map(UserTrack::getTrack)
.collect(Collectors.toList());
}

// 관심 트랙 삭제
public void removeUserTrack(String studentId, String trackName) {
User user = userRepository.findByStudentId(studentId)
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));

Track track = trackRepository.findByName(trackName)
.orElseThrow(() -> new RuntimeException("트랙을 찾을 수 없습니다."));

UserTrack userTrack = userTrackRepository.findByUserAndTrack(user, track)
.orElseThrow(() -> new RuntimeException("사용자 트랙을 찾을 수 없습니다."));

userTrackRepository.delete(userTrack);
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,8 @@
import com.example.enjoy.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.springframework.stereotype.Service;
import okhttp3.JavaNetCookieJar;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
Expand Down
Loading