From 25d97955ee1181b514df962bbd0add5cfa269230 Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Tue, 19 Sep 2023 02:14:31 +0900 Subject: [PATCH] =?UTF-8?q?YEL-163=20[feat]=20=EA=B3=A0=EB=93=B1=ED=95=99?= =?UTF-8?q?=EA=B5=90=20=EB=8C=80=ED=95=99=EA=B5=90=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AuthController.java | 30 +++++++++++++++--- .../dto/response/ClassNameSearchResponse.java | 16 ++++++++++ .../authorization/service/AuthService.java | 18 +++++++++-- .../server/domain/group/entity/School.java | 7 +++++ .../domain/group/entity/SchoolType.java | 28 +++++++++++++++++ .../group/entity/SchoolTypeConverter.java | 31 +++++++++++++++++++ .../group/repository/SchoolJpaRepository.java | 27 ++++++++++++++-- .../group/repository/SchoolRepository.java | 6 ++++ .../repository/SchoolRepositoryImpl.java | 20 +++++++++++- .../server/global/common/SuccessCode.java | 1 + .../domain/group/FakeSchoolRepository.java | 16 ++++++++++ 11 files changed, 191 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/yello/server/domain/authorization/dto/response/ClassNameSearchResponse.java create mode 100644 src/main/java/com/yello/server/domain/group/entity/SchoolType.java create mode 100644 src/main/java/com/yello/server/domain/group/entity/SchoolTypeConverter.java diff --git a/src/main/java/com/yello/server/domain/authorization/controller/AuthController.java b/src/main/java/com/yello/server/domain/authorization/controller/AuthController.java index be0382bb..17ae8912 100644 --- a/src/main/java/com/yello/server/domain/authorization/controller/AuthController.java +++ b/src/main/java/com/yello/server/domain/authorization/controller/AuthController.java @@ -1,5 +1,6 @@ package com.yello.server.domain.authorization.controller; +import static com.yello.server.global.common.SuccessCode.CLASS_NAME_SEARCH_BY_SCHOOL_NAME_SCHOOL_SUCCESS; import static com.yello.server.global.common.SuccessCode.DEPARTMENT_NAME_SEARCH_BY_SCHOOL_NAME_SCHOOL_SUCCESS; import static com.yello.server.global.common.SuccessCode.LOGIN_SUCCESS; import static com.yello.server.global.common.SuccessCode.ONBOARDING_FRIENDS_SUCCESS; @@ -13,6 +14,7 @@ import com.yello.server.domain.authorization.dto.request.OAuthRequest; import com.yello.server.domain.authorization.dto.request.OnBoardingFriendRequest; import com.yello.server.domain.authorization.dto.request.SignUpRequest; +import com.yello.server.domain.authorization.dto.response.ClassNameSearchResponse; import com.yello.server.domain.authorization.dto.response.DepartmentSearchResponse; import com.yello.server.domain.authorization.dto.response.GroupNameSearchResponse; import com.yello.server.domain.authorization.dto.response.OAuthResponse; @@ -54,7 +56,8 @@ public BaseResponse getYelloIdValidation(@RequestParam("yelloId") Strin @PostMapping("/signup") @SlackSignUpNotification - public BaseResponse postSignUp(@Valid @RequestBody SignUpRequest signUpRequest) { + public BaseResponse postSignUp( + @Valid @RequestBody SignUpRequest signUpRequest) { val data = authService.signUp(signUpRequest); return BaseResponse.success(SIGN_UP_SUCCESS, data); } @@ -68,7 +71,7 @@ public BaseResponse postFriendList( return BaseResponse.success(ONBOARDING_FRIENDS_SUCCESS, data); } - @GetMapping("/school") + @GetMapping("/group/univ/name") public BaseResponse getSchoolList( @NotNull @RequestParam("keyword") String keyword, @NotNull @RequestParam("page") Integer page @@ -77,9 +80,9 @@ public BaseResponse getSchoolList( return BaseResponse.success(SCHOOL_NAME_SEARCH_SCHOOL_SUCCESS, data); } - @GetMapping("/school/department") + @GetMapping("/group/univ/department") public BaseResponse getDepartmentList( - @NotNull @RequestParam("school") String schoolName, + @NotNull @RequestParam("name") String schoolName, @NotNull @RequestParam("keyword") String keyword, @NotNull @RequestParam("page") Integer page ) { @@ -92,4 +95,23 @@ public BaseResponse postReIssueToken(@ServiceToken ServiceTokenV val data = authService.reIssueToken(tokens); return BaseResponse.success(RE_ISSUE_TOKEN_AUTH_SUCCESS, data); } + + @GetMapping("/group/high/name") + public BaseResponse getHighSchoolList( + @NotNull @RequestParam("keyword") String keyword, + @NotNull @RequestParam("page") Integer page + ) { + val data = authService.getHighSchoolList(keyword, createPageable(page)); + return BaseResponse.success(SCHOOL_NAME_SEARCH_SCHOOL_SUCCESS, data); + } + + @GetMapping("/group/high/class") + public BaseResponse getHighSchoolClassName( + @NotNull @RequestParam("name") String schoolName, + @NotNull @RequestParam("keyword") String keyword + ) { + System.out.println("sfsdfsdfs"); + val data = authService.getHighSchoolClassName(schoolName, keyword); + return BaseResponse.success(CLASS_NAME_SEARCH_BY_SCHOOL_NAME_SCHOOL_SUCCESS, data); + } } diff --git a/src/main/java/com/yello/server/domain/authorization/dto/response/ClassNameSearchResponse.java b/src/main/java/com/yello/server/domain/authorization/dto/response/ClassNameSearchResponse.java new file mode 100644 index 00000000..26e7588a --- /dev/null +++ b/src/main/java/com/yello/server/domain/authorization/dto/response/ClassNameSearchResponse.java @@ -0,0 +1,16 @@ +package com.yello.server.domain.authorization.dto.response; + +import com.yello.server.domain.group.entity.School; +import lombok.Builder; + +@Builder +public record ClassNameSearchResponse( + Long groupId +) { + + public static ClassNameSearchResponse of(School school) { + return ClassNameSearchResponse.builder() + .groupId(school.getId()) + .build(); + } +} diff --git a/src/main/java/com/yello/server/domain/authorization/service/AuthService.java b/src/main/java/com/yello/server/domain/authorization/service/AuthService.java index bcb7bd02..15be436a 100644 --- a/src/main/java/com/yello/server/domain/authorization/service/AuthService.java +++ b/src/main/java/com/yello/server/domain/authorization/service/AuthService.java @@ -9,6 +9,7 @@ import com.yello.server.domain.authorization.dto.request.OAuthRequest; import com.yello.server.domain.authorization.dto.request.OnBoardingFriendRequest; import com.yello.server.domain.authorization.dto.request.SignUpRequest; +import com.yello.server.domain.authorization.dto.response.ClassNameSearchResponse; import com.yello.server.domain.authorization.dto.response.DepartmentSearchResponse; import com.yello.server.domain.authorization.dto.response.GroupNameSearchResponse; import com.yello.server.domain.authorization.dto.response.OAuthResponse; @@ -103,7 +104,7 @@ public SignUpResponse signUp(SignUpRequest signUpRequest) { @Transactional public void recommendUser(String recommendYelloId, String userYelloId) { - if (recommendYelloId != null && !recommendYelloId.isEmpty()) { + if (recommendYelloId!=null && !recommendYelloId.isEmpty()) { User recommendedUser = userRepository.getByYelloId(recommendYelloId); User user = userRepository.getByYelloId(userYelloId); @@ -129,7 +130,7 @@ public void makeFriend(User user, List friendIds) { Friend savedFriend = friendRepository.save(Friend.createFriend(user, friend.get())); friendRepository.save(Friend.createFriend(friend.get(), user)); - + notificationService.sendFriendNotification(savedFriend); } }); @@ -179,4 +180,17 @@ public ServiceTokenVO reIssueToken(@NotNull ServiceTokenVO tokens) { throw new NotExpiredTokenForbiddenException(TOKEN_NOT_EXPIRED_AUTH_EXCEPTION); } + + public GroupNameSearchResponse getHighSchoolList(String keyword, Pageable pageable) { + int totalCount = schoolRepository.countDistinctHighSchoolNameContaining(keyword); + final List nameList = schoolRepository.findDistinctHighSchoolNameContaining(keyword, + pageable); + return GroupNameSearchResponse.of(totalCount, nameList); + } + + public ClassNameSearchResponse getHighSchoolClassName(String schoolName, String keyword) { + School school = + schoolRepository.findHighSchoolIdBySchoolNameAndClassName(schoolName, keyword); + return ClassNameSearchResponse.of(school); + } } diff --git a/src/main/java/com/yello/server/domain/group/entity/School.java b/src/main/java/com/yello/server/domain/group/entity/School.java index 04e1973a..6cee4f7d 100644 --- a/src/main/java/com/yello/server/domain/group/entity/School.java +++ b/src/main/java/com/yello/server/domain/group/entity/School.java @@ -1,6 +1,7 @@ package com.yello.server.domain.group.entity; import javax.persistence.Column; +import javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -13,6 +14,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; @Getter @Entity @@ -42,6 +44,11 @@ public class School { @Column(nullable = false) private String departmentName; + @Column(nullable = false) + @Convert(converter = SchoolTypeConverter.class) + @ColumnDefault("UNIVERSITY") + private SchoolType schoolType; + public static School of(String schoolName, String departmentName) { return School.builder() .schoolName(schoolName) diff --git a/src/main/java/com/yello/server/domain/group/entity/SchoolType.java b/src/main/java/com/yello/server/domain/group/entity/SchoolType.java new file mode 100644 index 00000000..8f944f25 --- /dev/null +++ b/src/main/java/com/yello/server/domain/group/entity/SchoolType.java @@ -0,0 +1,28 @@ +package com.yello.server.domain.group.entity; + +import java.text.MessageFormat; +import java.util.Arrays; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum SchoolType { + UNIVERSITY("UNIVERSITY"), + HIGHSCHOOL("HIGH_SCHOOL"); + + private final String intial; + + public static SchoolType fromCode(String dbData) { + return Arrays.stream(SchoolType.values()) + .filter(v -> v.getIntial().equals(dbData)) + .findAny() + .orElseThrow(() -> new IllegalArgumentException( + MessageFormat.format("존재하지 않는 학교타입 입니다. {0}", dbData))); + } + + public String intial() { + return intial; + } + +} diff --git a/src/main/java/com/yello/server/domain/group/entity/SchoolTypeConverter.java b/src/main/java/com/yello/server/domain/group/entity/SchoolTypeConverter.java new file mode 100644 index 00000000..92f28ad9 --- /dev/null +++ b/src/main/java/com/yello/server/domain/group/entity/SchoolTypeConverter.java @@ -0,0 +1,31 @@ +package com.yello.server.domain.group.entity; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; +import lombok.extern.log4j.Log4j2; + +@Converter +@Log4j2 +public class SchoolTypeConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(SchoolType schoolType) { + if (schoolType==null) { + return null; + } + return schoolType.getIntial(); + } + + @Override + public SchoolType convertToEntityAttribute(String dbData) { + if (dbData==null) { + return null; + } + try { + return SchoolType.fromCode(dbData); + } catch (IllegalArgumentException exception) { + log.error("failure to convert cause unexpected code" + dbData + exception); + throw exception; + } + } +} diff --git a/src/main/java/com/yello/server/domain/group/repository/SchoolJpaRepository.java b/src/main/java/com/yello/server/domain/group/repository/SchoolJpaRepository.java index c1adc7a1..f6761ae9 100644 --- a/src/main/java/com/yello/server/domain/group/repository/SchoolJpaRepository.java +++ b/src/main/java/com/yello/server/domain/group/repository/SchoolJpaRepository.java @@ -2,6 +2,7 @@ import com.yello.server.domain.group.entity.School; import java.util.List; +import java.util.Optional; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -11,12 +12,14 @@ public interface SchoolJpaRepository extends JpaRepository { @Query("select count (DISTINCT s.schoolName)from School s " + "where s.schoolName " + - "like CONCAT('%',:schoolName,'%')") + "like CONCAT('%',:schoolName,'%') " + + "and s.schoolType = 'UNIVERSITY'") Integer countDistinctSchoolNameContaining(@Param("schoolName") String schoolName); @Query("select distinct(s.schoolName) from School s " + "where s.schoolName " + - "like CONCAT('%',:schoolName,'%')") + "like CONCAT('%',:schoolName,'%' )" + + "and s.schoolType = 'UNIVERSITY'") List findDistinctSchoolNameContaining(@Param("schoolName") String schoolName, Pageable pageable); @@ -32,5 +35,25 @@ Integer countAllBySchoolNameContaining(@Param("schoolName") String schoolName, List findAllBySchoolNameContaining(@Param("schoolName") String schoolName, @Param("departmentName") String departmentName, Pageable pageable); + @Query("select count (DISTINCT s.schoolName)from School s " + + "where s.schoolName " + + "like CONCAT('%',:schoolName,'%') " + + "and s.schoolType = 'HIGH_SCHOOL'") + Integer countDistinctHighSchoolNameContaining(@Param("schoolName") String schoolName); + + @Query("select distinct(s.schoolName) from School s " + + "where s.schoolName " + + "like CONCAT('%',:schoolName,'%' )" + + "and s.schoolType = 'HIGH_SCHOOL'") + List findDistinctHighSchoolNameContaining(@Param("schoolName") String schoolName, + Pageable pageable); + + @Query("select s from School s " + + "where s.schoolName = :schoolName " + + "and s.departmentName = :className " + + "and s.schoolType = 'HIGH_SCHOOL'") + Optional findHighSchoolIdBySchoolNameAndClassName( + @Param("schoolName") String schoolName, @Param("className") String className); + } diff --git a/src/main/java/com/yello/server/domain/group/repository/SchoolRepository.java b/src/main/java/com/yello/server/domain/group/repository/SchoolRepository.java index 20ca4034..c5d0c310 100644 --- a/src/main/java/com/yello/server/domain/group/repository/SchoolRepository.java +++ b/src/main/java/com/yello/server/domain/group/repository/SchoolRepository.java @@ -21,4 +21,10 @@ public interface SchoolRepository { List findAllBySchoolNameContaining(String schoolName, String departmentName, Pageable pageable); + + Integer countDistinctHighSchoolNameContaining(String schoolName); + + List findDistinctHighSchoolNameContaining(String schoolName, Pageable pageable); + + School findHighSchoolIdBySchoolNameAndClassName(String schoolName, String className); } diff --git a/src/main/java/com/yello/server/domain/group/repository/SchoolRepositoryImpl.java b/src/main/java/com/yello/server/domain/group/repository/SchoolRepositoryImpl.java index 1e35bd8e..447a8fc9 100644 --- a/src/main/java/com/yello/server/domain/group/repository/SchoolRepositoryImpl.java +++ b/src/main/java/com/yello/server/domain/group/repository/SchoolRepositoryImpl.java @@ -53,6 +53,24 @@ public Integer countAllBySchoolNameContaining(String schoolName, String departme @Override public List findAllBySchoolNameContaining(String schoolName, String departmentName, Pageable pageable) { - return schoolJpaRepository.findAllBySchoolNameContaining(schoolName, departmentName, pageable); + return schoolJpaRepository.findAllBySchoolNameContaining(schoolName, departmentName, + pageable); + } + + @Override + public Integer countDistinctHighSchoolNameContaining(String schoolName) { + return schoolJpaRepository.countDistinctHighSchoolNameContaining(schoolName); + } + + @Override + public List findDistinctHighSchoolNameContaining(String schoolName, Pageable pageable) { + return schoolJpaRepository.findDistinctHighSchoolNameContaining(schoolName, pageable); + } + + @Override + public School findHighSchoolIdBySchoolNameAndClassName(String schoolName, + String className) { + return schoolJpaRepository.findHighSchoolIdBySchoolNameAndClassName(schoolName, className) + .orElseThrow(() -> new GroupNotFoundException(GROUPID_NOT_FOUND_GROUP_EXCEPTION)); } } diff --git a/src/main/java/com/yello/server/global/common/SuccessCode.java b/src/main/java/com/yello/server/global/common/SuccessCode.java index 99c72aed..b7f250f6 100644 --- a/src/main/java/com/yello/server/global/common/SuccessCode.java +++ b/src/main/java/com/yello/server/global/common/SuccessCode.java @@ -45,6 +45,7 @@ public enum SuccessCode { READ_QUESTION_ADMIN_SUCCESS(OK, "어드민 페이지 질문 조회에 성공하였습니다."), READ_QUESTION_DETAIL_ADMIN_SUCCESS(OK, "어드민 페이지 질문 상세 조회에 성공하였습니다."), DELETE_QUESTION_ADMIN_SUCCESS(OK, "어드민 권환으로 질문지 삭제에 성공하였습니다."), + CLASS_NAME_SEARCH_BY_SCHOOL_NAME_SCHOOL_SUCCESS(OK, "학반 검색에 성공했습니다."), /** * 201 CREATED diff --git a/src/test/java/com/yello/server/domain/group/FakeSchoolRepository.java b/src/test/java/com/yello/server/domain/group/FakeSchoolRepository.java index d1c3cbbc..a085194d 100644 --- a/src/test/java/com/yello/server/domain/group/FakeSchoolRepository.java +++ b/src/test/java/com/yello/server/domain/group/FakeSchoolRepository.java @@ -66,4 +66,20 @@ public List findAllBySchoolNameContaining(String schoolName, String depa Pageable pageable) { return null; } + + @Override + public Integer countDistinctHighSchoolNameContaining(String schoolName) { + return null; + } + + @Override + public List findDistinctHighSchoolNameContaining(String schoolName, Pageable pageable) { + return null; + } + + @Override + public School findHighSchoolIdBySchoolNameAndClassName(String schoolName, + String className) { + return null; + } }