Skip to content

Commit b6b372f

Browse files
authored
Merge pull request #182 from DguFarmSystem/refactor/#180-minigame-review
Refactor/#180 minigame review
2 parents 70d056b + 6afe267 commit b6b372f

43 files changed

Lines changed: 412 additions & 319 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,40 @@
11
package org.farmsystem.homepage.domain.minigame.dex.controller;
22

33
import lombok.RequiredArgsConstructor;
4-
import org.farmsystem.homepage.domain.minigame.dex.dto.request.DexRequest;
5-
import org.farmsystem.homepage.domain.minigame.dex.dto.response.DexListResponse;
6-
import org.farmsystem.homepage.domain.minigame.dex.dto.response.DexResponse;
4+
import org.farmsystem.homepage.domain.minigame.dex.dto.request.DexRequestDTO;
5+
import org.farmsystem.homepage.domain.minigame.dex.dto.response.DexResponseDTO;
76
import org.farmsystem.homepage.domain.minigame.dex.service.DexService;
8-
import org.springframework.http.HttpStatus;
7+
import org.farmsystem.homepage.global.common.SuccessResponse;
8+
import org.springframework.http.ResponseEntity;
99
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1010
import org.springframework.web.bind.annotation.*;
1111

12+
import java.util.List;
13+
1214
@RestController
1315
@RequestMapping("/api/dex")
1416
@RequiredArgsConstructor
1517
public class DexController {
1618

1719
private final DexService dexService;
1820

19-
@PostMapping
20-
@ResponseStatus(HttpStatus.CREATED)
21-
public DexResponse addDex(
22-
@AuthenticationPrincipal Long userId,
23-
@RequestBody DexRequest request
21+
// 도감 전체 목록 조회 API
22+
@GetMapping
23+
public ResponseEntity<SuccessResponse<?>> getDexList(
24+
@AuthenticationPrincipal Long userId
2425
) {
25-
return dexService.addDex(userId, request);
26+
List<DexResponseDTO> response = dexService.getDexList(userId);
27+
return SuccessResponse.ok(response);
2628
}
2729

28-
@GetMapping
29-
public DexListResponse getDexList(
30-
@AuthenticationPrincipal Long userId
30+
// 도감 등록 API
31+
@PostMapping
32+
public ResponseEntity<SuccessResponse<?>> addDex(
33+
@AuthenticationPrincipal Long userId,
34+
@RequestBody DexRequestDTO request
3135
) {
32-
return dexService.getDexList(userId);
36+
DexResponseDTO response = dexService.addDex(userId, request);
37+
return SuccessResponse.created(response);
3338
}
39+
3440
}

src/main/java/org/farmsystem/homepage/domain/minigame/dex/dto/request/DexRequest.java

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.farmsystem.homepage.domain.minigame.dex.dto.request;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record DexRequestDTO(
6+
@NotNull Long ownedPlant // Store의 store_goods_number를 의미
7+
) {
8+
}

src/main/java/org/farmsystem/homepage/domain/minigame/dex/dto/response/DexListResponse.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/java/org/farmsystem/homepage/domain/minigame/dex/dto/response/DexResponse.java

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package org.farmsystem.homepage.domain.minigame.dex.dto.response;
2+
3+
import org.farmsystem.homepage.domain.minigame.dex.entity.Dex;
4+
5+
public record DexResponseDTO(
6+
Long dexId,
7+
Long ownedPlant // Store의 store_goods_number를 의미
8+
) {
9+
public static DexResponseDTO from(Dex dex) {
10+
return new DexResponseDTO(
11+
dex.getDexId(),
12+
dex.getOwnedPlant().getStoreGoodsNumber()
13+
);
14+
}
15+
}

src/main/java/org/farmsystem/homepage/domain/minigame/dex/entity/Dex.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
import jakarta.persistence.*;
44
import lombok.*;
5+
import org.farmsystem.homepage.domain.minigame.inventory.entity.Store;
56
import org.farmsystem.homepage.domain.minigame.player.entity.Player;
67

78
@Entity
89
@Table(name = "dex")
910
@Getter
1011
@NoArgsConstructor
1112
@AllArgsConstructor
12-
@Builder
1313
public class Dex {
1414
@Id
1515
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -20,7 +20,22 @@ public class Dex {
2020
@JoinColumn(name = "player_id")
2121
private Player player;
2222

23-
@Enumerated(EnumType.STRING)
24-
@Column(name = "owned_plant", length = 50, nullable = false)
25-
private PlantType ownedPlant;
23+
// 식물 종류는 Store 마스터 테이블을 참조
24+
@ManyToOne(fetch = FetchType.LAZY, optional = false)
25+
@JoinColumn(
26+
name = "owned_plant",
27+
referencedColumnName = "store_goods_number"
28+
)
29+
private Store ownedPlant;
30+
31+
// 식물 등록 정적 팩토리 메서드
32+
public static Dex createDex(Player player, Store ownedPlant) {
33+
return new Dex(player, ownedPlant);
34+
}
35+
36+
// private 생성자 → createDex 메서드 통해서만 생성
37+
private Dex(Player player, Store ownedPlant) {
38+
this.player = player;
39+
this.ownedPlant = ownedPlant;
40+
}
2641
}

src/main/java/org/farmsystem/homepage/domain/minigame/dex/entity/PlantType.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.farmsystem.homepage.domain.minigame.dex.entity;
22

3+
// PlantType은 인벤토리 코드 수정후 삭제 예정 -> enum 대신 store 마스터 테이블에서 번호(Long)로 관리 예정
34
public enum PlantType {
45
// 일반
56
Roseangela,
@@ -70,4 +71,4 @@ public enum PlantType {
7071
Cherry_Shiny,
7172
Cherryblossoms_Shiny,
7273
Roseofsharon_Shiny
73-
}
74+
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package org.farmsystem.homepage.domain.minigame.dex.repository;
22

33
import org.farmsystem.homepage.domain.minigame.dex.entity.Dex;
4-
import org.farmsystem.homepage.domain.minigame.dex.entity.PlantType;
4+
import org.farmsystem.homepage.domain.minigame.inventory.entity.Store;
55
import org.farmsystem.homepage.domain.minigame.player.entity.Player;
66
import org.springframework.data.jpa.repository.JpaRepository;
77

88
import java.util.List;
99

1010
public interface DexRepository extends JpaRepository<Dex, Long> {
11+
// 플레이어의 도감 전체 조회
1112
List<Dex> findByPlayer(Player player);
1213

13-
boolean existsByPlayerAndOwnedPlant(Player player, PlantType ownedPlant);
14+
// 이미 등록된 식물인지 여부 확인
15+
boolean existsByPlayerAndOwnedPlant(Player player, Store ownedPlant);
1416
}
Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package org.farmsystem.homepage.domain.minigame.dex.service;
22

3-
import jakarta.transaction.Transactional;
43
import lombok.RequiredArgsConstructor;
5-
import org.farmsystem.homepage.domain.minigame.dex.dto.request.DexRequest;
6-
import org.farmsystem.homepage.domain.minigame.dex.dto.response.DexListResponse;
7-
import org.farmsystem.homepage.domain.minigame.dex.dto.response.DexResponse;
4+
import org.farmsystem.homepage.domain.minigame.dex.dto.request.DexRequestDTO;
5+
import org.farmsystem.homepage.domain.minigame.dex.dto.response.DexResponseDTO;
86
import org.farmsystem.homepage.domain.minigame.dex.entity.Dex;
97
import org.farmsystem.homepage.domain.minigame.dex.repository.DexRepository;
8+
import org.farmsystem.homepage.domain.minigame.inventory.entity.Store;
9+
import org.farmsystem.homepage.domain.minigame.inventory.repository.StoreRepository;
1010
import org.farmsystem.homepage.domain.minigame.player.entity.Player;
1111
import org.farmsystem.homepage.domain.minigame.player.repository.PlayerRepository;
1212
import org.farmsystem.homepage.global.error.ErrorCode;
1313
import org.farmsystem.homepage.global.error.exception.BusinessException;
14+
import org.hibernate.type.TrueFalseConverter;
1415
import org.springframework.stereotype.Service;
16+
import org.springframework.transaction.annotation.Transactional;
1517

1618
import java.util.List;
1719

@@ -21,35 +23,34 @@ public class DexService {
2123

2224
private final PlayerRepository playerRepository;
2325
private final DexRepository dexRepository;
26+
private final StoreRepository storeRepository;
2427

2528
@Transactional
26-
public DexResponse addDex(Long userId, DexRequest request) {
29+
public DexResponseDTO addDex(Long userId, DexRequestDTO request) {
30+
// 플레이어 조회
2731
Player player = playerRepository.findByUser_UserId(userId)
2832
.orElseThrow(() -> new BusinessException(ErrorCode.PLAYER_NOT_FOUND));
29-
30-
// 이미 등록된 식물인지 체크 (existsBy 사용)
31-
if (dexRepository.existsByPlayerAndOwnedPlant(player, request.ownedPlant())) {
33+
// 해당 식물이 store에 존재하는지 확인
34+
Store store = storeRepository.findByStoreGoodsNumber(request.ownedPlant())
35+
.orElseThrow(() -> new BusinessException(ErrorCode.STORE_NOT_FOUND));
36+
// 이미 등록된 식물인지 확인
37+
if (dexRepository.existsByPlayerAndOwnedPlant(player, store)) {
3238
throw new BusinessException(ErrorCode.DEX_ALREADY_REGISTERED);
3339
}
3440

35-
Dex savedDex = dexRepository.save(Dex.builder()
36-
.player(player)
37-
.ownedPlant(request.ownedPlant())
38-
.build());
39-
40-
return DexResponse.from(savedDex);
41+
Dex savedDex = dexRepository.save(Dex.createDex(player, store));
42+
return DexResponseDTO.from(savedDex);
4143
}
4244

43-
@Transactional
44-
public DexListResponse getDexList(Long userId) {
45+
@Transactional(readOnly= true)
46+
public List<DexResponseDTO> getDexList(Long userId) {
47+
// 플레이어 조회
4548
Player player = playerRepository.findByUser_UserId(userId)
4649
.orElseThrow(() -> new BusinessException(ErrorCode.PLAYER_NOT_FOUND));
47-
48-
List<DexResponse> list = dexRepository.findByPlayer(player)
50+
// 도감 목록 조회 및 반환
51+
return dexRepository.findByPlayer(player)
4952
.stream()
50-
.map(DexResponse::from)
53+
.map(DexResponseDTO::from)
5154
.toList();
52-
53-
return new DexListResponse(list);
5455
}
5556
}

0 commit comments

Comments
 (0)