Skip to content

Commit 9ddf928

Browse files
authored
Merge pull request #18 from enjoy-hack/Daeun
Feat : 관심 트랙 추가 조회 삭제 기능
2 parents cdaa0b4 + 180dc7c commit 9ddf928

10 files changed

Lines changed: 222 additions & 11 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.example.enjoy.controller;
2+
3+
import com.example.enjoy.dto.TrackDetailDto;
4+
import com.example.enjoy.dto.UserTrackResponse;
5+
import com.example.enjoy.entity.Track;
6+
import com.example.enjoy.entity.UserTrack;
7+
import com.example.enjoy.entity.user.User;
8+
import com.example.enjoy.service.UserTrackService;
9+
import io.swagger.v3.oas.annotations.Operation;
10+
import org.springframework.http.MediaType;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.web.bind.annotation.*;
13+
14+
import java.util.List;
15+
16+
@RestController
17+
@RequestMapping("/api/user-track")
18+
public class UserTrackController {
19+
private final UserTrackService userTrackService;
20+
21+
public UserTrackController(UserTrackService userTrackService) {
22+
this.userTrackService = userTrackService;
23+
}
24+
25+
@Operation(summary = "사용자 관심 트랙 추가", description = "사용자가 관심 트랙을 추가합니다.")
26+
@PostMapping(produces = MediaType.APPLICATION_JSON_VALUE)
27+
public ResponseEntity<UserTrackResponse> addUserTrack(
28+
@RequestParam String studentId,
29+
@RequestParam String trackName) {
30+
UserTrack savedUserTrack = userTrackService.addUserTrack(studentId, trackName);
31+
UserTrackResponse response = UserTrackResponse.from(savedUserTrack);
32+
return ResponseEntity.ok(response);
33+
}
34+
35+
@Operation(summary = "사용자 관심 트랙 조회", description = "사용자가 추가한 관심 트랙 목록을 조회합니다.")
36+
@GetMapping("/{studentId}")
37+
public ResponseEntity<List<TrackDetailDto>> getUserTracks(
38+
@PathVariable String studentId) {
39+
List<Track> tracks = userTrackService.getUserTracks(studentId);
40+
if (tracks.isEmpty()) {
41+
return ResponseEntity.noContent().build();
42+
}
43+
else{
44+
List<TrackDetailDto> trackDetails = tracks.stream()
45+
.map(track -> new TrackDetailDto().from(track))
46+
.toList();
47+
return ResponseEntity.ok(trackDetails);
48+
}
49+
}
50+
51+
@Operation(summary = "사용자 관심 트랙 삭제", description = "사용자가 추가한 관심 트랙을 삭제합니다.")
52+
@DeleteMapping
53+
public ResponseEntity<Void> removeUserTrack(
54+
@RequestParam String studentId,
55+
@RequestParam String trackName) {
56+
userTrackService.removeUserTrack(studentId, trackName);
57+
return ResponseEntity.ok().build();
58+
}
59+
}

src/main/java/com/example/enjoy/dto/TrackDetailDto.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.enjoy.dto;
22

3+
import com.example.enjoy.entity.Track;
34
import lombok.Data;
45
import lombok.Getter;
56
import lombok.Setter;
@@ -16,4 +17,11 @@ public class TrackDetailDto {
1617
private String department;
1718
private String description; // 트랙에 대한 설명 추가
1819
private List<CourseStatusDto> courses; // 트랙에 포함된 과목 목록
20+
21+
public TrackDetailDto from (Track track) {
22+
this.trackId = track.getId();
23+
this.trackName = track.getName();
24+
this.department = track.getDepartment();
25+
return this;
26+
}
1927
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.example.enjoy.dto;
2+
3+
import com.example.enjoy.entity.FavoriteCourse;
4+
import com.example.enjoy.entity.UserTrack;
5+
import lombok.*;
6+
7+
import java.time.LocalDateTime;
8+
9+
@Getter
10+
@AllArgsConstructor
11+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
12+
public class UserTrackResponse {
13+
private String studentId;
14+
private String trackName;
15+
16+
public static UserTrackResponse from(UserTrack userTrack) {
17+
return new UserTrackResponse(
18+
userTrack.getUser().getStudentId(),
19+
userTrack.getTrack().getName()
20+
);
21+
}
22+
}

src/main/java/com/example/enjoy/entity/Track.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ public class Track {
1818

1919
@OneToMany(mappedBy = "track", cascade = CascadeType.ALL)
2020
private List<TrackCourse> courses = new ArrayList<>();
21+
22+
@OneToMany(mappedBy = "track", cascade = CascadeType.ALL)
23+
private List<UserTrack> userTracks = new ArrayList<>();
24+
25+
public void addUserTrack(UserTrack userTrack) {
26+
userTracks.add(userTrack);
27+
userTrack.setTrack(this);
28+
}
29+
30+
2131
// public void addCourse(TrackCourse course) {
2232
// courses.add(course);
2333
// course.setTrack(this);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.example.enjoy.entity;
2+
3+
import com.example.enjoy.entity.user.User;
4+
import com.example.enjoy.util.BaseEntity;
5+
import jakarta.persistence.*;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.Setter;
9+
10+
import java.time.LocalDateTime;
11+
12+
@Entity
13+
@Getter
14+
@Setter
15+
public class UserTrack extends BaseEntity {
16+
@Id
17+
@GeneratedValue(strategy = GenerationType.IDENTITY)
18+
private Long id;
19+
20+
@ManyToOne(fetch = FetchType.LAZY)
21+
@JoinColumn(name = "user_id")
22+
private User user;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "track_id")
26+
private Track track;
27+
28+
}

src/main/java/com/example/enjoy/entity/user/User.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
import com.example.enjoy.entity.BaseTimeEntity;
44

5+
import com.example.enjoy.entity.UserTrack;
56
import jakarta.persistence.*;
67
import lombok.*;
78

9+
import java.util.ArrayList;
10+
import java.util.List;
11+
812
@Builder
913
@Entity
1014
@Getter
@@ -31,6 +35,9 @@ public class User extends BaseTimeEntity {
3135
@Column(nullable = false)
3236
private String completedSemester;
3337

38+
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
39+
private List<UserTrack> userTracks = new ArrayList<>();
40+
3441
public void updateUserInfo(String studentId, String username, String major, String grade, String completedSemester) {
3542
this.studentId = studentId;
3643
this.username = username;

src/main/java/com/example/enjoy/repository/TrackRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ public interface TrackRepository extends JpaRepository<Track, Long> {
2020
*/
2121
@Query("SELECT t FROM Track t JOIN FETCH t.courses WHERE t.id = :trackId")
2222
Optional<Track> findByIdWithCourses(@Param("trackId") Long trackId);
23+
24+
Optional<Track> findByName(String name);
2325
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.example.enjoy.repository;
2+
3+
import com.example.enjoy.entity.Track;
4+
import com.example.enjoy.entity.UserTrack;
5+
import com.example.enjoy.entity.user.User;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.util.List;
10+
import java.util.Optional;
11+
12+
@Repository
13+
public interface UserTrackRepository extends JpaRepository<UserTrack, Long> {
14+
15+
List<UserTrack> findAllByUser(User user);
16+
17+
Optional<UserTrack> findByUserAndTrack(User user, Track track);
18+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.example.enjoy.service;
2+
3+
import com.example.enjoy.entity.Track;
4+
import com.example.enjoy.entity.UserTrack;
5+
import com.example.enjoy.entity.user.User;
6+
import com.example.enjoy.repository.TrackRepository;
7+
import com.example.enjoy.repository.UserRepository;
8+
import com.example.enjoy.repository.UserTrackRepository;
9+
import org.springframework.stereotype.Service;
10+
11+
import java.time.LocalDateTime;
12+
import java.util.List;
13+
import java.util.stream.Collectors;
14+
15+
@Service
16+
public class UserTrackService {
17+
18+
private final TrackRepository trackRepository;
19+
private final UserRepository userRepository;
20+
private final UserTrackRepository userTrackRepository;
21+
22+
public UserTrackService(TrackRepository trackRepository, UserRepository userRepository, UserTrackRepository userTrackRepository) {
23+
this.trackRepository = trackRepository;
24+
this.userRepository = userRepository;
25+
this.userTrackRepository = userTrackRepository;
26+
}
27+
28+
public UserTrack addUserTrack(String studentId, String trackName) {
29+
User user = userRepository.findByStudentId(studentId)
30+
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));
31+
32+
Track track = trackRepository.findByName(trackName)
33+
.orElseThrow(() -> new RuntimeException("트랙을 찾을 수 없습니다."));
34+
35+
UserTrack userTrack = new UserTrack();
36+
userTrack.setUser(user);
37+
userTrack.setTrack(track);
38+
39+
userTrackRepository.save(userTrack);
40+
return userTrack;
41+
}
42+
43+
public List<Track> getUserTracks(String studentId) {
44+
User user = userRepository.findByStudentId(studentId)
45+
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));
46+
47+
return userTrackRepository.findAllByUser(user)
48+
.stream()
49+
.map(UserTrack::getTrack)
50+
.collect(Collectors.toList());
51+
}
52+
53+
// 관심 트랙 삭제
54+
public void removeUserTrack(String studentId, String trackName) {
55+
User user = userRepository.findByStudentId(studentId)
56+
.orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다."));
57+
58+
Track track = trackRepository.findByName(trackName)
59+
.orElseThrow(() -> new RuntimeException("트랙을 찾을 수 없습니다."));
60+
61+
UserTrack userTrack = userTrackRepository.findByUserAndTrack(user, track)
62+
.orElseThrow(() -> new RuntimeException("사용자 트랙을 찾을 수 없습니다."));
63+
64+
userTrackRepository.delete(userTrack);
65+
}
66+
67+
68+
}

src/main/java/com/example/enjoy/service/loginService/SejongLoginService.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,8 @@
1111
import com.example.enjoy.repository.UserRepository;
1212
import lombok.RequiredArgsConstructor;
1313
import lombok.extern.slf4j.Slf4j;
14-
import okhttp3.*;
15-
import org.jsoup.Jsoup;
16-
import org.jsoup.nodes.Document;
1714
import org.springframework.stereotype.Service;
18-
import okhttp3.JavaNetCookieJar;
19-
import javax.net.ssl.*;
2015
import java.io.IOException;
21-
import java.net.CookieManager;
22-
import java.net.CookiePolicy;
23-
import java.net.SocketTimeoutException;
24-
import java.util.ArrayList;
25-
import java.util.List;
26-
import java.util.concurrent.TimeUnit;
2716

2817
@Slf4j
2918
@Service

0 commit comments

Comments
 (0)