Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FE] [BE] FIX : 마이 프로필 조회 시 연장권 정보 추가 #1424 #1427

Merged
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
20b7f74
[BE] FEAT: pending 상태인 사물함들의 CabinetInfoResponseDto를 가져오는 API 생성
LeeDaeWook Nov 20, 2023
a19f32e
[BE] FEAT: pending 상태인 사물함들의 CabinetInfoResponseDto를 가져오는 기능 추가
LeeDaeWook Nov 20, 2023
f73ddae
[BE] FEAT: pending 상태인 사물함들의 CabinetInfoResponseDto를 저장하는 Dto 생성
LeeDaeWook Nov 20, 2023
5ae7838
[BE] FEAT: 층 별로 pending 상태인 사물함들의 CabinetPreviewDto를 저장하는 Dto로 변경
LeeDaeWook Nov 20, 2023
287e22b
[BE] DOCS: 주석 추가
LeeDaeWook Nov 21, 2023
8fecbdd
[BE] REFACTOR: auth guard 재설정
LeeDaeWook Nov 21, 2023
61085e7
[BE] FIX: 층 별로 비어있는 사물함에 대한 cabinetPreviewDto도 반환하도록 수정
LeeDaeWook Nov 22, 2023
b95ff8e
[BE] FIX : v4/users/me에서 반환하는 MyProfileResponseDto에 LentExtension 필드를…
LeeDaeWook Nov 24, 2023
2ce8005
[BE] TEST : getMyProfile 단위 테스트 수정
LeeDaeWook Nov 24, 2023
d6d6954
[BE] REFACTOR : 불필요한 주석 제거
LeeDaeWook Nov 24, 2023
79c138d
Merge branch 'dev' of github.com:innovationacademy-kr/42cabi into be/…
junyoung2015 Nov 24, 2023
cb7a4b0
[BE] FIX : 연장권이 없을 때 발생하는 indexOutOfBound 예외 해결
LeeDaeWook Nov 24, 2023
b50a4d0
Merge branch 'be/dev/fix_put_lentExtension_to_MyProfileResponseDto/#1…
LeeDaeWook Nov 24, 2023
6b4fcee
[FE] FEAT: /users/me 에서 받아오는 lentHistory 를 사용하도록 프로필 페이지 로직 수정 #1424
junyoung2015 Nov 24, 2023
53f777e
[FE] FIX: UserDto 에서 받아오는 연장권 정보 이름 backend 와 동일하게 수정 #1424
junyoung2015 Nov 24, 2023
6ba0e5a
[FE] FIX: 연장권을 CabinetInfoArea 에서 사용 시 정확한 연장권 정보를 출력하도록 수정 #1424
junyoung2015 Nov 24, 2023
4c35759
[FE] FIX: Card 내부 클릭 가능한 버튼 hover 시 검은색 글씨로 바꾸는 효과 추가, 밑줄 제거 #1424
junyoung2015 Nov 24, 2023
e04b6cc
[BE] FIX : MyProfileResponseDto에 LentExtensionResponseDto를 넣도록 수정
LeeDaeWook Nov 24, 2023
b0f1337
Merge branch 'be/dev/fix_put_lentExtension_to_MyProfileResponseDto/#1…
LeeDaeWook Nov 24, 2023
73de9af
[FE] FIX: lentExtension 을 lentExtensionResponseDto 로 변경 #1424
junyoung2015 Nov 24, 2023
def9e80
[FE] FIX: 대여정보 이전 대여자 margin 수정 #1424
junyoung2015 Nov 24, 2023
5ec8fc2
[BE] REFACTOR : 불필요한 주석 제거
LeeDaeWook Nov 24, 2023
f823198
Merge branch 'be/dev/fix_put_lentExtension_to_MyProfileResponseDto/#1…
LeeDaeWook Nov 24, 2023
ffd1ec9
[FE] FIX: Card 내부 버튼이 클릭 가능할 때만 검은색으로 바뀌도록 수정 #1424
junyoung2015 Nov 24, 2023
78991f1
Merge branch 'be/dev/fix_put_lentExtension_to_MyProfileResponseDto/#1…
junyoung2015 Nov 24, 2023
cfe01d3
Merge branch 'dev' of github.com:innovationacademy-kr/42cabi into be/…
enaenen Nov 25, 2023
1cac991
[BE] REFACTOR: ActiveLentExtension 관련 로직수정 - 피드백 반영
enaenen Nov 25, 2023
f44d8db
[BE] REFACTOR:
enaenen Nov 25, 2023
13c87b5
[BE] REFACTOR:
enaenen Nov 25, 2023
1571d93
[FE] FIX: ProfilePage에서 반납 시 렌트 상태를 올바르게 받도록 수정 #1424
junyoung2015 Nov 25, 2023
4d07b90
t pushMerge branch 'be/dev/fix_put_lentExtension_to_MyProfileResponse…
junyoung2015 Nov 25, 2023
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
Expand Up @@ -8,6 +8,7 @@
import org.ftclub.cabinet.cabinet.service.CabinetFacadeService;
import org.ftclub.cabinet.dto.BuildingFloorsDto;
import org.ftclub.cabinet.dto.CabinetInfoResponseDto;
import org.ftclub.cabinet.dto.CabinetPendingResponseDto;
import org.ftclub.cabinet.dto.CabinetsPerSectionResponseDto;
import org.ftclub.cabinet.exception.ControllerException;
import org.springframework.web.bind.annotation.GetMapping;
Expand Down Expand Up @@ -68,4 +69,16 @@ public CabinetInfoResponseDto getCabinetInfo(
log.info("Called getCabinetInfo {}", cabinetId);
return cabinetFacadeService.getCabinetInfo(cabinetId);
}

/**
* 오픈 예정인 사물함들의 정보를 가져옵니다.
*
* @return 오픈 예정인 사물함들의 정보를 반환합니다.
*/
@GetMapping("/pending")
@AuthGuard(level = AuthLevel.USER_OR_ADMIN)
public CabinetPendingResponseDto getPendingCabinets() {
log.info("Called getPendingCabinets");
return cabinetFacadeService.getPendingCabinets();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,166 +29,184 @@
@Transactional
public class CabinetOptionalFetcher {

private final CabinetRepository cabinetRepository;
private final CabinetMapper cabinetMapper;

/*-------------------------------------------FIND-------------------------------------------*/

public Cabinet findCabinet(Long cabinetId) {
log.debug("Called findCabinet: {}", cabinetId);
return cabinetRepository.findById(cabinetId).orElse(null);
}

public List<ActiveCabinetInfoEntities> findCabinetsActiveLentHistoriesByBuildingAndFloor(
String building, Integer floor) {
log.debug("Called findCabinetsActiveLentHistoriesByBuildingAndFloor: {}, {}", building,
floor);
return cabinetRepository.findCabinetActiveLentHistoryUserListByBuildingAndFloor(building,
floor).stream()
.map(result -> {
Cabinet cabinet = (Cabinet) result[0];
LentHistory lentHistory = (LentHistory) result[1];
User user = (User) result[2];
return cabinetMapper.toActiveCabinetInfoEntitiesDto(cabinet, lentHistory, user);
}).collect(Collectors.toList());
}

public List<ActiveCabinetInfoEntities> findCabinetsActiveLentHistoriesByBuildingAndFloor2(
String building, Integer floor) {
return cabinetRepository.findCabinetsActiveLentHistoriesByBuildingAndFloor(building, floor);
}

public List<Cabinet> findCabinetsByBuildingAndFloor2(String building, Integer floor) {
return cabinetRepository.findAllCabinetsByBuildingAndFloor(building, floor);
}

/**
* 유저 ID로 사물함을 찾습니다.
*
* @param userId 유저ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet findLentCabinetByUserId(Long userId) {
log.debug("Called findLentCabinetByUserId: {}", userId);
return cabinetRepository.findLentCabinetByUserId(userId).orElse(null);
}

public List<String> findAllBuildings() {
log.debug("Called findAllBuildings");
return cabinetRepository.findAllBuildings();
}

public List<Integer> findAllFloorsByBuilding(String building) {
log.debug("Called findAllFloorsByBuilding: {}", building);
return cabinetRepository.findAllFloorsByBuilding(building);
}

// deprecated
public List<String> findAllSectionsByBuildingAndFloor(String building, Integer floor) {
log.debug("Called findAllSectionsByBuildingAndFloor: {}, {}", building, floor);
return cabinetRepository.findAllSectionsByBuildingAndFloor(building, floor);
}

public List<Cabinet> findAllPendingCabinetsByCabinetStatusAndBeforeEndedAt(CabinetStatus cabinetStatus,
LocalDateTime currentDate) {
log.debug("Called findAllCabinetsByCabinetStatusAndBeforeEndedAt: {}", cabinetStatus);
return cabinetRepository.findAllCabinetsByCabinetStatusAndBeforeEndedAt(cabinetStatus, currentDate);
}

public Page<Cabinet> findPaginationByLentType(LentType lentType, PageRequest pageable) {
log.debug("Called findPaginationByLentType: {}", lentType);
return cabinetRepository.findPaginationByLentType(lentType, pageable);
}

public Page<Cabinet> findPaginationByStatus(CabinetStatus status, PageRequest pageable) {
log.debug("Called findPaginationByStatus: {}", status);
return cabinetRepository.findPaginationByStatus(status, pageable);
}

public Page<Cabinet> findPaginationByVisibleNum(Integer visibleNum, PageRequest pageable) {
log.debug("Called findPaginationByVisibleNum: {}", visibleNum);
return cabinetRepository.findPaginationByVisibleNum(visibleNum, pageable);
}

public List<Cabinet> findAllCabinetsByLocation(Location location) {
log.debug("Called findAllCabinetsByLocation: {}", location);
return cabinetRepository.findAllCabinetsByLocation(location);
}

public List<Cabinet> findAllCabinetsByBuildingAndFloor(String building, Integer floor) {
return cabinetRepository.findAllByBuildingAndFloor(building, floor);
}
/*-------------------------------------------GET--------------------------------------------*/


/**
* 사물함 ID로 변경 사항이 예정된 사물함을 찾습니다.
* <p>
* X Lock을 획득한 상태로 가져옵니다.
*
* @param cabinetId 사물함 ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getCabinetForUpdate(Long cabinetId) {
log.debug("Called getCabinetForUpdate: {}", cabinetId);
return cabinetRepository.findByIdForUpdate(cabinetId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}

/**
* 사물함 ID로 사물함을 찾습니다.
*
* @param cabinetId 사물함 ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getCabinet(Long cabinetId) {
log.debug("Called getCabinet: {}", cabinetId);
return cabinetRepository.findById(cabinetId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}

/**
* 유저 ID로 사물함을 찾습니다.
*
* @param userId 유저ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getLentCabinetByUserId(Long userId) {
log.debug("Called getLentCabinetByUserId: {}", userId);
return cabinetRepository.findLentCabinetByUserId(userId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}

/**
* 사물함 ID로 동아리 사물함을 찾습니다.
*
* @param cabinetId 사물함 ID
* @return 동아리 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getClubCabinet(Long cabinetId) {
log.debug("Called getClubCabinet: {}", cabinetId);
Cabinet cabinet = getCabinet(cabinetId);
if (!cabinet.isLentType(LentType.CLUB)) {
throw new ServiceException(ExceptionStatus.NOT_FOUND_CABINET);
}
return cabinet;
}

/**
* 사물함 ID로 위치(빌딩, 층, 섹션) 정보를 찾습니다.
*
* @param cabinetId 사물함 ID
* @return 위치 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Location getLocation(Long cabinetId) {
log.debug("Called getLocation: {}", cabinetId);
return cabinetRepository.findLocationById(cabinetId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}
private final CabinetRepository cabinetRepository;
private final CabinetMapper cabinetMapper;

/*-------------------------------------------FIND-------------------------------------------*/

public Cabinet findCabinet(Long cabinetId) {
log.debug("Called findCabinet: {}", cabinetId);
return cabinetRepository.findById(cabinetId).orElse(null);
}

public List<ActiveCabinetInfoEntities> findCabinetsActiveLentHistoriesByBuildingAndFloor(
String building, Integer floor) {
log.debug("Called findCabinetsActiveLentHistoriesByBuildingAndFloor: {}, {}", building,
floor);
return cabinetRepository.findCabinetActiveLentHistoryUserListByBuildingAndFloor(building,
floor).stream()
.map(result -> {
Cabinet cabinet = (Cabinet) result[0];
LentHistory lentHistory = (LentHistory) result[1];
User user = (User) result[2];
return cabinetMapper.toActiveCabinetInfoEntitiesDto(cabinet, lentHistory, user);
}).collect(Collectors.toList());
}

public List<ActiveCabinetInfoEntities> findCabinetsActiveLentHistoriesByBuildingAndFloor2(
String building, Integer floor) {
return cabinetRepository.findCabinetsActiveLentHistoriesByBuildingAndFloor(building, floor);
}

public List<Cabinet> findCabinetsByBuildingAndFloor2(String building, Integer floor) {
return cabinetRepository.findAllCabinetsByBuildingAndFloor(building, floor);
}

/**
* 유저 ID로 사물함을 찾습니다.
*
* @param userId 유저ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet findLentCabinetByUserId(Long userId) {
log.debug("Called findLentCabinetByUserId: {}", userId);
return cabinetRepository.findLentCabinetByUserId(userId).orElse(null);
}

public List<String> findAllBuildings() {
log.debug("Called findAllBuildings");
return cabinetRepository.findAllBuildings();
}

public List<Integer> findAllFloorsByBuilding(String building) {
log.debug("Called findAllFloorsByBuilding: {}", building);
return cabinetRepository.findAllFloorsByBuilding(building);
}

// deprecated
public List<String> findAllSectionsByBuildingAndFloor(String building, Integer floor) {
log.debug("Called findAllSectionsByBuildingAndFloor: {}, {}", building, floor);
return cabinetRepository.findAllSectionsByBuildingAndFloor(building, floor);
}

public List<Cabinet> findAllPendingCabinetsByCabinetStatusAndBeforeEndedAt(
CabinetStatus cabinetStatus,
LocalDateTime currentDate) {
log.debug("Called findAllCabinetsByCabinetStatusAndBeforeEndedAt: {}", cabinetStatus);
return cabinetRepository.findAllCabinetsByCabinetStatusAndBeforeEndedAt(cabinetStatus,
currentDate);
}

public Page<Cabinet> findPaginationByLentType(LentType lentType, PageRequest pageable) {
log.debug("Called findPaginationByLentType: {}", lentType);
return cabinetRepository.findPaginationByLentType(lentType, pageable);
}

public Page<Cabinet> findPaginationByStatus(CabinetStatus status, PageRequest pageable) {
log.debug("Called findPaginationByStatus: {}", status);
return cabinetRepository.findPaginationByStatus(status, pageable);
}

public Page<Cabinet> findPaginationByVisibleNum(Integer visibleNum, PageRequest pageable) {
log.debug("Called findPaginationByVisibleNum: {}", visibleNum);
return cabinetRepository.findPaginationByVisibleNum(visibleNum, pageable);
}

public List<Cabinet> findAllCabinetsByLocation(Location location) {
log.debug("Called findAllCabinetsByLocation: {}", location);
return cabinetRepository.findAllCabinetsByLocation(location);
}

public List<Cabinet> findAllCabinetsByBuildingAndFloor(String building, Integer floor) {
return cabinetRepository.findAllByBuildingAndFloor(building, floor);
}
/*-------------------------------------------GET--------------------------------------------*/


/**
* 사물함 ID로 변경 사항이 예정된 사물함을 찾습니다.
* <p>
* X Lock을 획득한 상태로 가져옵니다.
*
* @param cabinetId 사물함 ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getCabinetForUpdate(Long cabinetId) {
log.debug("Called getCabinetForUpdate: {}", cabinetId);
return cabinetRepository.findByIdForUpdate(cabinetId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}

/**
* 사물함 ID로 사물함을 찾습니다.
*
* @param cabinetId 사물함 ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getCabinet(Long cabinetId) {
log.debug("Called getCabinet: {}", cabinetId);
return cabinetRepository.findById(cabinetId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}

/**
* 유저 ID로 사물함을 찾습니다.
*
* @param userId 유저ID
* @return 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getLentCabinetByUserId(Long userId) {
log.debug("Called getLentCabinetByUserId: {}", userId);
return cabinetRepository.findLentCabinetByUserId(userId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}

/**
* 사물함 ID로 동아리 사물함을 찾습니다.
*
* @param cabinetId 사물함 ID
* @return 동아리 사물함 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Cabinet getClubCabinet(Long cabinetId) {
log.debug("Called getClubCabinet: {}", cabinetId);
Cabinet cabinet = getCabinet(cabinetId);
if (!cabinet.isLentType(LentType.CLUB)) {
throw new ServiceException(ExceptionStatus.NOT_FOUND_CABINET);
}
return cabinet;
}

/**
* 사물함 ID로 위치(빌딩, 층, 섹션) 정보를 찾습니다.
*
* @param cabinetId 사물함 ID
* @return 위치 엔티티
* @throws ServiceException 사물함을 찾을 수 없는 경우
*/
public Location getLocation(Long cabinetId) {
log.debug("Called getLocation: {}", cabinetId);
return cabinetRepository.findLocationById(cabinetId)
.orElseThrow(() -> new ServiceException(ExceptionStatus.NOT_FOUND_CABINET));
}

/**
* 충별로 오픈 예정인 사물함들을 찾습니다.
* @param floor 층
* @return 오픈 예정인 사물함들의 ID 리스트
*/

public List<Long> findPendingCabinets(Integer floor) {
log.debug("Called findPendingCabinets");
return cabinetRepository.findPendingCabinets(floor).orElse(null);
}

public List<Long> findAvailableCabinets(Integer floor) {
log.debug("Called findAvailableCabinets");
return cabinetRepository.findAvailableCabinets(floor).orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,4 +104,14 @@ List<Object[]> findCabinetActiveLentHistoryUserListByBuildingAndFloor(
"WHERE c.cabinetPlace.location.building = :building AND c.cabinetPlace.location.floor = :floor")
List<Cabinet> findAllByBuildingAndFloor(@Param("building") String building,
@Param("floor") Integer floor);

@Query("SELECT c.cabinetId " +
"FROM Cabinet c " +
"WHERE c.status = org.ftclub.cabinet.cabinet.domain.CabinetStatus.PENDING AND c.cabinetPlace.location.floor = :floor")
Optional<List<Long>> findPendingCabinets(@Param("floor") Integer floor);

@Query("SELECT c.cabinetId " +
"FROM Cabinet c " +
"WHERE c.status = org.ftclub.cabinet.cabinet.domain.CabinetStatus.AVAILABLE AND c.cabinetPlace.location.floor = :floor")
Comment on lines +108 to +115
Copy link
Collaborator

@Ssuamje Ssuamje Nov 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DBMS 자체에서는 해당하는 컬럼을 varchar(문자열)로 두어서 사용하고 있을거여서, JPQL을 직접 이용한 내부 상수로 작성하는 것보다 <해당 컬럼> = '해당컬럼의 문자열'과 같은 방식으로 사용하는게 더 나을 것 같다는 생각이 드네요(현재 방식은 패키지에 변경이 생겨도 영향이 있습니다). 근데 이런식으로하면 해당하는 상수의 문자열 값이 변경될 때 터지게 되는데, 이 부분은 어플리케이션에서 변화가 생기면 DB와 정합성을 맞추기 위한 어쩔 수 없는 과정이라고 생각이 드네요.
한편, 별도의 상태를 정해서 find하는 메서드보다 해당하는 상수(사물함 상태)를 지정해서 좀 더 제너럴하게 받아올 수 있게 작성해주시면 좋을 것 같습니다.

Optional<List<Long>> findAvailableCabinets(@Param("floor") Integer floor);
}
Loading
Loading