Skip to content

Commit

Permalink
Merge pull request #64 from dnd-side-project/feat/#56-item
Browse files Browse the repository at this point in the history
회원이 착용한 아이템을 조회한다.
  • Loading branch information
hwangdaesun authored Feb 5, 2025
2 parents f7ef46d + 235bc1a commit d1ebe29
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,7 @@
public interface FindItemsApiSpec {
@Operation(summary = "내 아이템 조회", description = "내 아이템 정보를 조회한다.")
ApiResponse<FindItemsResponse> findMyItems(UserDetails user);

@Operation(summary = "내가 장착한 아이템 조회", description = "내가 장착한 아이템 정보를 조회한다.")
ApiResponse<FindItemsResponse> findEquippedItems(UserDetails user);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.dnd.sbooky.api.item;

import com.dnd.sbooky.api.item.response.FindItemsResponse;
import com.dnd.sbooky.core.item.ItemType;
import com.dnd.sbooky.core.item.MemberItemRepository;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class FindEquippedItemUsecase {

private final MemberItemRepository memberItemRepository;

@Transactional(readOnly = true)
public FindItemsResponse findEquippedItems(Long memberId) {
Map<ItemType, List<Long>> equippedItems =
memberItemRepository.findEquippedItemsByMemberId(memberId).stream()
.collect(
Collectors.groupingBy(
findItemDTO -> findItemDTO.itemType(),
Collectors.mapping(
findItemDTO -> findItemDTO.itemId(),
Collectors.toList())));
return FindItemsResponse.from(equippedItems);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,21 @@
public class FindItemsController implements FindItemsApiSpec {

private final FindItemsUseCase findItemsUseCase;
private final FindEquippedItemUsecase findEquippedItemUsecase;

@GetMapping("/items")
public ApiResponse<FindItemsResponse> findMyItems(
@Parameter(hidden = true) @AuthenticationPrincipal UserDetails user) {
return ApiResponse.success(findItemsUseCase.findMyItems(extractMemberId(user)));
}

@GetMapping("/items/equipped")
public ApiResponse<FindItemsResponse> findEquippedItems(
@Parameter(hidden = true) @AuthenticationPrincipal UserDetails user) {
return ApiResponse.success(
findEquippedItemUsecase.findEquippedItems(extractMemberId(user)));
}

private Long extractMemberId(UserDetails user) {
return Long.valueOf(user.getUsername());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@
@NoRepositoryBean
public interface MemberItemRepositoryCustom {
List<FindItemDTO> findItemsByMemberId(Long memberId);

List<FindItemDTO> findEquippedItemsByMemberId(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.dnd.sbooky.core.item.dto.FindItemDTO;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand All @@ -23,4 +24,20 @@ public List<FindItemDTO> findItemsByMemberId(Long memberId) {
.where(memberItem.memberEntity.id.eq(memberId))
.fetch();
}

@Override
public List<FindItemDTO> findEquippedItemsByMemberId(Long memberId) {
return queryFactory
.select(
Projections.constructor(
FindItemDTO.class, memberItem.itemEntity.id, item.type))
.from(memberItem)
.join(memberItem.itemEntity, item)
.where(memberItem.memberEntity.id.eq(memberId), isEquipped())
.fetch();
}

private BooleanExpression isEquipped() {
return memberItem.equipped.isTrue();
}
}

0 comments on commit d1ebe29

Please sign in to comment.