Skip to content

Commit 8b5773b

Browse files
authored
Merge pull request #44 from gotothesky2/mark/major
Mark/major
2 parents cfa98bb + b7ee440 commit 8b5773b

10 files changed

Lines changed: 155 additions & 8 deletions

File tree

src/main/java/hackerthon/likelion13th/canfly/global/api/SuccessCode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ public enum SuccessCode implements BaseCode { // 성공
4242
MAJOR_UNIV_LIKE_SUCCESS(HttpStatus.OK, "MAJOR_UNIV_MARK_2001", "전공+대학 북마크 성공"),
4343
FIELD_LIKED_LIST_VIEW_SUCCESS(HttpStatus.OK, "FIELD_2006", "로그인 사용자가 북마크한 모든 계열명을 반환합니다."),
4444
FIELD_LIST_VIEW_SUCCESS(HttpStatus.OK, "FIELD_2007", "계열 전체 조회 완료."),
45+
MAJOR_LIKED_LIST_VIEW_SUCCESS(HttpStatus.OK, "MAJOR_2006", "내 북마크 전공 전체 조회 완료"),
46+
MAJOR_LIST_VIEW_SUCCESS(HttpStatus.OK, "MAJOR_2007", "전공 전체 조회 완료."),
47+
MAJOR_UNIV_LIKED_LIST_VIEW_SUCCESS(HttpStatus.OK, "MAJOR_UNIV_2006", "전공별 대학-전공 북마크 조회 완료"),
48+
MAJOR_UNIV_LIST_BY_MAJOR_SUCCESS(HttpStatus.OK, "MAJOR_UNIV_2007", "전공 기준 대학 목록 조회 완료"),
4549

4650
// 내가 추가한 코드
4751
TOKEN_PROCESS_SUCCESS(HttpStatus.OK, "TOKEN_2001", "코인(토큰) 사용이 완료되었습니다.");

src/main/java/hackerthon/likelion13th/canfly/search/controller/FieldController.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import hackerthon.likelion13th.canfly.login.auth.mapper.CustomUserDetails;
77
import hackerthon.likelion13th.canfly.login.service.UserService;
88
import hackerthon.likelion13th.canfly.search.dto.FieldDto;
9-
import hackerthon.likelion13th.canfly.search.repository.FieldBookmarkRepository;
109
import hackerthon.likelion13th.canfly.search.service.FieldService;
1110
import io.swagger.v3.oas.annotations.Operation;
1211
import io.swagger.v3.oas.annotations.responses.ApiResponses;
@@ -19,14 +18,13 @@
1918

2019
import java.util.List;
2120

22-
@Tag(name = "계열 조회", description = "계열 관련 API")
21+
@Tag(name = "계열 관련 컨트롤러", description = "계열 관련 API")
2322
@RestController
2423
@RequestMapping("/field")
2524
@RequiredArgsConstructor
2625
public class FieldController {
2726
private final UserService userService;
2827
private final FieldService fieldService;
29-
private final FieldBookmarkRepository fieldBookmarkRepository;
3028

3129
@Operation(summary = "내가 좋아요한 계열 전체", description = "로그인 사용자가 북마크한 모든 계열을 반환합니다.")
3230
@ApiResponses({

src/main/java/hackerthon/likelion13th/canfly/search/controller/FieldMarkController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import org.springframework.web.bind.annotation.RequestMapping;
1717
import org.springframework.web.bind.annotation.RestController;
1818

19-
@Tag(name = "계열 북마크", description = "계열 북마크 컨트롤러입니다")
19+
@Tag(name = "계열 북마크 관련 컨트롤러", description = "계열 북마크 컨트롤러입니다")
2020
@RestController
2121
@RequestMapping("/field/{fieldId}/like")
2222
@RequiredArgsConstructor
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,57 @@
11
package hackerthon.likelion13th.canfly.search.controller;
22

3+
import hackerthon.likelion13th.canfly.domain.user.User;
4+
import hackerthon.likelion13th.canfly.global.api.ApiResponse;
5+
import hackerthon.likelion13th.canfly.global.api.SuccessCode;
6+
import hackerthon.likelion13th.canfly.login.auth.mapper.CustomUserDetails;
7+
import hackerthon.likelion13th.canfly.login.service.UserService;
8+
import hackerthon.likelion13th.canfly.search.dto.MajorDto;
9+
import hackerthon.likelion13th.canfly.search.service.MajorService;
10+
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
12+
import io.swagger.v3.oas.annotations.tags.Tag;
13+
import lombok.RequiredArgsConstructor;
14+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
15+
import org.springframework.web.bind.annotation.GetMapping;
16+
import org.springframework.web.bind.annotation.RequestMapping;
17+
import org.springframework.web.bind.annotation.RestController;
18+
19+
import java.util.List;
20+
21+
@Tag(name = "전공 관련 컨트롤러", description = "전공 관련 API")
22+
@RestController
23+
@RequestMapping("/major")
24+
@RequiredArgsConstructor
325
public class MajorController {
26+
private final UserService userService;
27+
private final MajorService majorService;
28+
29+
@Operation(summary = "내가 좋아요한 전공 전체", description = "로그인 사용자가 북마크한 모든 전공을 반환합니다.")
30+
@ApiResponses({
31+
@io.swagger.v3.oas.annotations.responses.
32+
ApiResponse(responseCode = "MAJOR_2006", description = "내 북마크 전공 전체 조회 완료")
33+
})
34+
@GetMapping("/like")
35+
public ApiResponse<List<MajorDto>> getMyLikedMajors(
36+
@AuthenticationPrincipal CustomUserDetails customUserDetails
37+
) {
38+
User user = userService.findUserByProviderId(customUserDetails.getUsername());
39+
List<MajorDto> majors = majorService.getAllLikedMajors(user);
40+
41+
return ApiResponse.onSuccess(SuccessCode.MAJOR_LIKED_LIST_VIEW_SUCCESS, majors);
42+
}
43+
44+
@Operation(summary = "전공 전체", description = "모든 전공을 반환합니다.")
45+
@ApiResponses({
46+
@io.swagger.v3.oas.annotations.responses.
47+
ApiResponse(responseCode = "MAJOR_2007", description = " 전체 조회 완료")
48+
})
49+
@GetMapping("/all")
50+
public ApiResponse<List<MajorDto>> getMajors(
51+
@AuthenticationPrincipal CustomUserDetails customUserDetails
52+
) {
53+
List<MajorDto> majors = majorService.getAllMajors();
54+
55+
return ApiResponse.onSuccess(SuccessCode.MAJOR_LIST_VIEW_SUCCESS, majors);
56+
}
457
}

src/main/java/hackerthon/likelion13th/canfly/search/controller/MajorMarkController.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@
55
import hackerthon.likelion13th.canfly.global.api.SuccessCode;
66
import hackerthon.likelion13th.canfly.login.auth.mapper.CustomUserDetails;
77
import hackerthon.likelion13th.canfly.login.service.UserService;
8+
import hackerthon.likelion13th.canfly.search.dto.UnivDto;
89
import hackerthon.likelion13th.canfly.search.service.MajorService;
910
import io.swagger.v3.oas.annotations.Operation;
1011
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1112
import io.swagger.v3.oas.annotations.tags.Tag;
1213
import lombok.RequiredArgsConstructor;
1314
import org.springframework.security.core.annotation.AuthenticationPrincipal;
14-
import org.springframework.web.bind.annotation.PathVariable;
15-
import org.springframework.web.bind.annotation.PostMapping;
16-
import org.springframework.web.bind.annotation.RequestMapping;
17-
import org.springframework.web.bind.annotation.RestController;
15+
import org.springframework.web.bind.annotation.*;
16+
17+
import java.util.List;
1818

1919
@Tag(name = "전공 및 전공-대학 북마크", description = "전공 북마크 컨트롤러입니다")
2020
@RestController
@@ -50,4 +50,17 @@ public ApiResponse<Boolean> toggleLikeWithUniv(
5050
majorService.toggleMajorUnivLike(majorId, univId, user);
5151
return ApiResponse.onSuccess(SuccessCode.MAJOR_UNIV_LIKE_SUCCESS, true);
5252
}
53+
54+
@Operation(summary = "전공을 개설한 대학 목록", description = "전공(majorId)을 개설한 대학 목록을 반환합니다.")
55+
@ApiResponses({
56+
@io.swagger.v3.oas.annotations.responses.
57+
ApiResponse(responseCode = "MAJOR_UNIV_2007", description = "전공 기준 대학 목록 조회 완료")
58+
})
59+
@GetMapping("/universities")
60+
public ApiResponse<List<UnivDto>> getUniversitiesByMajor(
61+
@PathVariable Long majorId
62+
) {
63+
List<UnivDto> result = majorService.getUniversitiesByMajor(majorId);
64+
return ApiResponse.onSuccess(SuccessCode.MAJOR_UNIV_LIST_BY_MAJOR_SUCCESS, result);
65+
}
5366
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11
package hackerthon.likelion13th.canfly.search.dto;
22

3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@NoArgsConstructor
10+
@AllArgsConstructor
11+
@Builder
312
public class MajorDto {
13+
private Long id; // major_id
14+
private String name; // major_name
415
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package hackerthon.likelion13th.canfly.search.dto;
2+
3+
import lombok.*;
4+
5+
@Getter
6+
@Setter
7+
@NoArgsConstructor
8+
@AllArgsConstructor
9+
@Builder
10+
public class UnivDto {
11+
private Long id;
12+
private String name;
13+
}

src/main/java/hackerthon/likelion13th/canfly/search/repository/MajorBookmarkRepository.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
import hackerthon.likelion13th.canfly.domain.major.MajorBookmark;
55
import hackerthon.likelion13th.canfly.domain.university.University;
66
import hackerthon.likelion13th.canfly.domain.user.User;
7+
import io.lettuce.core.dynamic.annotation.Param;
78
import org.springframework.data.jpa.repository.JpaRepository;
89
import org.springframework.data.jpa.repository.Modifying;
910
import org.springframework.data.jpa.repository.Query;
1011

12+
import java.util.List;
13+
1114
public interface MajorBookmarkRepository extends JpaRepository<MajorBookmark, Long> {
1215

1316
boolean existsByUserAndMajor(User user, Major major);
@@ -36,4 +39,15 @@ INSERT INTO major_bookmark (uid, m_id, univ_id)
3639
void upsertMajorWithUniv(@org.springframework.data.repository.query.Param("userId") String userId,
3740
@org.springframework.data.repository.query.Param("majorId") Long majorId,
3841
@org.springframework.data.repository.query.Param("univId") Long univId);
42+
43+
@Query(value = """
44+
SELECT m.m_id AS id, m.m_name AS name
45+
FROM major_bookmark mb
46+
JOIN major m ON mb.m_id = m.m_id
47+
WHERE mb.uid = :userId
48+
GROUP BY m.m_id, m.m_name
49+
ORDER BY COALESCE(MAX(mb.created_at), '1000-01-01 00:00:00') DESC,
50+
MAX(mb.mb_id) DESC
51+
""", nativeQuery = true)
52+
List<Object[]> findAllLikedMajors(@Param("userId") String userId);
3953
}

src/main/java/hackerthon/likelion13th/canfly/search/service/MajorService.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import hackerthon.likelion13th.canfly.domain.user.User;
66
import hackerthon.likelion13th.canfly.global.api.ErrorCode;
77
import hackerthon.likelion13th.canfly.global.exception.GeneralException;
8+
import hackerthon.likelion13th.canfly.search.dto.MajorDto;
9+
import hackerthon.likelion13th.canfly.search.dto.UnivDto;
810
import hackerthon.likelion13th.canfly.search.repository.MajorBookmarkRepository;
911
import hackerthon.likelion13th.canfly.search.repository.MajorRepository;
1012
import hackerthon.likelion13th.canfly.university.repository.UniversityRepository;
@@ -13,6 +15,8 @@
1315
import lombok.extern.slf4j.Slf4j;
1416
import org.springframework.stereotype.Service;
1517

18+
import java.util.List;
19+
1620
@Slf4j
1721
@Service
1822
@RequiredArgsConstructor
@@ -51,4 +55,29 @@ public void toggleMajorUnivLike(Long majorId, Long univId, User user) {
5155
majorBookmarkRepository.upsertMajorWithUniv(user.getUid(), major.getId(), univ.getId());
5256
}
5357
}
58+
59+
public List<MajorDto> getAllLikedMajors(User user) {
60+
List<Object[]> rows = majorBookmarkRepository.findAllLikedMajors(user.getUid());
61+
return rows.stream()
62+
.map(r -> new MajorDto(((Number) r[0]).longValue(), (String) r[1]))
63+
.toList();
64+
}
65+
66+
public List<MajorDto> getAllMajors() {
67+
List<Major> majors = majorRepository.findAll();
68+
69+
return majors.stream()
70+
.map(m -> new MajorDto(m.getId(), m.getName()))
71+
.toList();
72+
}
73+
74+
public List<UnivDto> getUniversitiesByMajor(Long majorId) {
75+
List<Object[]> rows = universityRepository.findUniversitiesByMajorId(majorId);
76+
return rows.stream()
77+
.map(r -> new UnivDto(
78+
((Number) r[0]).longValue(), // univ_id
79+
(String) r[1] // univ_name
80+
))
81+
.toList();
82+
}
5483
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
package hackerthon.likelion13th.canfly.university.repository;
22

33
import hackerthon.likelion13th.canfly.domain.university.University;
4+
import io.lettuce.core.dynamic.annotation.Param;
45
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
57

8+
import java.util.List;
69
import java.util.Optional;
710

811
public interface UniversityRepository extends JpaRepository<University, Long> {
912
Optional<University> findByName(String name);
13+
14+
@Query(value = """
15+
SELECT DISTINCT u.univ_id AS id, u.univ_name AS name
16+
FROM university_major um
17+
JOIN university u ON u.univ_id = um.univ_id
18+
WHERE um.m_id = :majorId
19+
ORDER BY u.univ_name
20+
""", nativeQuery = true)
21+
List<Object[]> findUniversitiesByMajorId(@Param("majorId") Long majorId);
1022
}

0 commit comments

Comments
 (0)