Skip to content

Commit

Permalink
Merge pull request #30 from DEPthes/feat/initial-character
Browse files Browse the repository at this point in the history
아이템 관련 DB 수정 및 로직 수정
  • Loading branch information
EunbeenDev authored Aug 14, 2024
2 parents 338355f + 9c77720 commit f22fb82
Show file tree
Hide file tree
Showing 11 changed files with 182 additions and 30 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.noplanb.domain.character.application;

import com.noplanb.domain.character.domain.Character;
import com.noplanb.domain.character.dto.request.NewCharacterReq;
import com.noplanb.domain.character.dto.request.UpdateNameReq;
import com.noplanb.domain.character.dto.response.InitialCharacterInfoRes;
import com.noplanb.domain.character.dto.response.MyCharacterInfoRes;
import com.noplanb.domain.character.dto.response.MyCharaterDetailRes;
import com.noplanb.domain.character.dto.response.MyCharaterListRes;
import com.noplanb.domain.character.repository.CharacterRepository;
import com.noplanb.domain.item.domain.Item;
import com.noplanb.domain.item.repository.ItemRepository;
import com.noplanb.domain.item_image.domain.repository.ItemImageRepository;
import com.noplanb.domain.user.repository.UserRepository;
import com.noplanb.global.config.security.token.UserPrincipal;
import com.noplanb.global.payload.ApiResponse;
import com.noplanb.global.payload.Message;
Expand All @@ -17,6 +21,7 @@
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;


Expand All @@ -27,6 +32,8 @@ public class CharacterService {

private final CharacterRepository characterRepository;
private final ItemImageRepository itemImageRepository;
private final UserRepository userRepository;
private final ItemRepository itemRepository;

// 캐릭터 보여주기 메소드
public MyCharaterListRes getMyCharacterDetail(UserPrincipal userPrincipal) {
Expand All @@ -40,8 +47,8 @@ public MyCharaterListRes getMyCharacterDetail(UserPrincipal userPrincipal) {
List<Item> quippedItems = items.stream().filter(Item::isEquipped).toList();

List<MyCharaterDetailRes> myCharaterDetailResList = quippedItems.stream().map(item -> MyCharaterDetailRes.builder()
.itemType(item.getItemType())
.itemImage((itemImageRepository.findItemImageByItem(item)).getItemImageUrl())
.itemType(item.getItemImage().getItemType())
.itemImage(item.getItemImage().getItemImageUrl())
.build()).toList();

MyCharaterListRes myCharaterListRes = MyCharaterListRes.builder()
Expand Down Expand Up @@ -112,4 +119,72 @@ public ResponseEntity<?> updateCharacterName(UserPrincipal userPrincipal, Update
.build();
return ResponseEntity.ok(apiResponse);
}

public ResponseEntity<?> getInitialCharacterInfo(UserPrincipal userPrincipal) {
Character character = characterRepository.findByUserId(userPrincipal.getId()).orElseThrow(() -> new IllegalArgumentException("캐릭터를 찾을 수 없습니다."));

// 캐릭터 이름
String characterName = character.getCharacterName();
// 캐릭터 착장 정보 메소드 사용
MyCharaterListRes myCharaterListRes = getMyCharacterDetail(userPrincipal);

InitialCharacterInfoRes initialCharacterInfoRes = InitialCharacterInfoRes.builder()
.characterName(characterName)
.myCharaterDetailResList(myCharaterListRes.getMyCharaterDetailResList())
.build();

ApiResponse apiResponse = ApiResponse.builder()
.check(true)
.information(initialCharacterInfoRes)
.build();

return ResponseEntity.ok(apiResponse);
}
//
// @Transactional
// public ResponseEntity<?> createInitialCharacter(UserPrincipal userPrincipal, NewCharacterReq newCharactemReq) {
// User user = userRepository.findById(userPrincipal.getId()).orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다."));
// List<ItemImage> items = itemImageRepository.findAll();
//
// // 캐릭터 객체 생성
// Character character = Character.builder()
// .characterName(newCharactemReq.getCharacterName())
// .totalExp(0L)
// .totalQuest(0L)
// .todayExp(0L)
// .level(1L)
// .user(user)
// .quests(new ArrayList<>())
// .items(new ArrayList<>())
// .build();
// characterRepository.save(character);
//
// // 아이템 객체 생성
// for (ItemImage itemImage : items) {
// Item item = Item.builder()
// .character(character)
// .isEquipped(false)
// .itemImage(itemImage)
// .build();
// itemRepository.save(item);
// }
//
// // 기본 아이템 장착 (요청값에 따라 다르게 설정)
// // 피부색(1->1, 2->2, 3->3) / 눈(1->4, 2->5, 3->6) / 머리(1->7,2->8) / 옷(9,10) 순서
//
// List<Long> equippedItemIds = newCharactemReq.getItemIdList();
// for (Long equippedItemId : equippedItemIds) {
//
// }
//
// ApiResponse apiResponse = ApiResponse.builder()
// .check(true)
// .information(Message.builder().message("캐릭터가 생성 및 기본 아이템 장착이 완료되었습니다.").build())
// .build();
//
// return ResponseEntity.ok(apiResponse);
// }

// 아이템 장착 메소드

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.noplanb.domain.character.controller;

import com.noplanb.domain.character.application.CharacterService;
import com.noplanb.domain.character.dto.request.NewCharacterReq;
import com.noplanb.domain.character.dto.request.UpdateNameReq;
import com.noplanb.domain.character.dto.response.InitialCharacterInfoRes;
import com.noplanb.domain.character.dto.response.MyCharacterInfoRes;
import com.noplanb.domain.character.dto.response.MyCharaterListRes;
import com.noplanb.global.config.security.token.CurrentUser;
Expand Down Expand Up @@ -61,6 +63,29 @@ public ResponseEntity<?> getMyCharacterInfo(@Parameter @CurrentUser UserPrincipa
return characterService.updateCharacterName(userPrincipal, updateNameReq);
}

@Operation(summary = "생성된 캐릭터 이미지, 이름 조회 API", description = "로그인 및 캐릭터 생성 직후 캐릭터 이미지와 이름을 조회하는 API입니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "캐릭터 생성 정보 조회 성공", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = InitialCharacterInfoRes.class) ) } ),
@ApiResponse(responseCode = "400", description = "캐릭터 생성 정보 조회 실패", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class) ) } ),
})
@GetMapping("/initial/info")
public ResponseEntity<?> getCreatedCharacterInfo(@Parameter @CurrentUser UserPrincipal userPrincipal){
return characterService.getInitialCharacterInfo(userPrincipal);
}

// @Operation(summary = "캐릭터 생성 API", description = "로그인 직후, 초기 캐릭터를 생성하는 API입니다.")
// @ApiResponses(value = {
// @ApiResponse(responseCode = "200", description = "초기 캐릭터 생성 성공", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = Message.class) ) } ),
// @ApiResponse(responseCode = "400", description = "초기 캐릭터 생성 실패", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class) ) } ),
// })
// @PostMapping("/initial/character")
// public ResponseEntity<?> createInitialCharacter(@Parameter @CurrentUser UserPrincipal userPrincipal, @RequestBody NewCharacterReq newCharactemReq){
// return characterService.createInitialCharacter(userPrincipal, newCharactemReq);
// }
//





}
13 changes: 13 additions & 0 deletions src/main/java/com/noplanb/domain/character/domain/Character.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.noplanb.domain.user.domain.User;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

Expand Down Expand Up @@ -63,6 +64,18 @@ public void resetTodayExp(){

}

@Builder
public Character(String characterName, Long totalExp, Long totalQuest, Long todayExp, Long level, User user, List<Quest> quests, List<Item> items) {
this.characterName = characterName;
this.totalExp = totalExp;
this.totalQuest = totalQuest;
this.todayExp = todayExp;
this.level = level;
this.user = user;
this.quests = quests;
this.items = items;
}

public void updateLevel() {
this.level += 1;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.noplanb.domain.character.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class InitialCharacterInfoRes {

@Schema(type = "String", example = "럭키조이", description = "캐릭터 이름")
private String characterName;

@Schema(type = "List", description = "캐릭터가 장착한 아이템 및 타입")
private List<MyCharaterDetailRes> myCharaterDetailResList;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.noplanb.domain.character.dto.response;

import com.noplanb.domain.item.domain.ItemType;
import com.noplanb.domain.item_image.domain.ItemType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
20 changes: 10 additions & 10 deletions src/main/java/com/noplanb/domain/item/application/ItemService.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

import java.util.List;

import static com.noplanb.domain.item.domain.ItemType.*;
import static com.noplanb.domain.item_image.domain.ItemType.*;

@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -51,42 +51,42 @@ public ResponseEntity<?> getCategoryItemList(UserPrincipal userPrincipal, String
case "hair":
// item_type이 HAIR인 item만 필터링
itemList = items.stream()
.filter(item -> item.getItemType().equals(HAIR))
.filter(item -> item.getItemImage().getItemType().equals(HAIR))
.toList();
break;

case "face":
// item_type이 EYE, FACECOLOR인 item만 필터링
itemList = items.stream()
.filter(item -> item.getItemType().equals(EYE) || item.getItemType().equals(FACECOLOR))
.filter(item -> item.getItemImage().getItemType().equals(EYE) || item.getItemImage().getItemType().equals(FACECOLOR))
.toList();
break;


case "fashion":
// item_type이 HEAD, GLASSES, CLOTHES인 item만 필터링
itemList = items.stream()
.filter(item -> item.getItemType().equals(HEAD) || item.getItemType().equals(GLASSES) || item.getItemType().equals(CLOTHES))
.filter(item -> item.getItemImage().getItemType().equals(HEAD) || item.getItemImage().getItemType().equals(GLASSES) || item.getItemImage().getItemType().equals(CLOTHES))
.toList();
break;

case "background":
// item_type이 BACKGROUND인 item만 필터링
itemList = items.stream()
.filter(item -> item.getItemType().equals(BACKGROUND))
.filter(item -> item.getItemImage().getItemType().equals(BACKGROUND))
.toList();
break;
}

List<CategoryItemRes> categoryItemRes=itemList.stream().map(item -> CategoryItemRes.builder()
.itemId(item.getId())
.itemImage(itemImageRepository.findItemImageByItem(item).getItemImageUrl())
.itemName(item.getItemName())
.itemType(item.getItemType())
.itemImage(item.getItemImage().getItemImageUrl())
.itemName(item.getItemImage().getItemName())
.itemType(item.getItemImage().getItemType())
// 장착 가능 여부 -> 캐릭터의 레벨이 아이템의 필요 레벨보다 높거나 같으면 장착 가능
.ableToEquip(character.getLevel() >= item.getRequiredLevel())
.ableToEquip(character.getLevel() >= item.getItemImage().getRequiredLevel()||item.isEquipped())
.isEquipped(item.isEquipped())
.requiredLevel(item.getRequiredLevel())
.requiredLevel(item.getItemImage().getRequiredLevel())
.build()).toList();


Expand Down
25 changes: 20 additions & 5 deletions src/main/java/com/noplanb/domain/item/domain/Item.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import com.noplanb.domain.character.domain.Character;
import com.noplanb.domain.common.BaseEntity;
import com.noplanb.domain.item_image.domain.ItemImage;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

Expand All @@ -16,16 +18,29 @@ public class Item extends BaseEntity {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
private String itemName;
@Enumerated(EnumType.STRING)
private ItemType itemType;
private boolean isEquipped;
private Long requiredLevel;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "character_id")
private Character character;

private boolean isEquipped;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_image_id")
private ItemImage itemImage;

@Builder
public Item(Character character, boolean isEquipped, ItemImage itemImage) {
this.character = character;
this.isEquipped = isEquipped;
this.itemImage = itemImage;
}

public void updateCharacter(Character character) {
this.character = character;
}

public void updateEquipped(boolean b) {
this.isEquipped = b;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.noplanb.domain.item.dto.response;


import com.noplanb.domain.item.domain.ItemType;
import com.noplanb.domain.item_image.domain.ItemType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
20 changes: 12 additions & 8 deletions src/main/java/com/noplanb/domain/item_image/domain/ItemImage.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

import static jakarta.persistence.GenerationType.IDENTITY;

@Entity
Expand All @@ -19,14 +22,15 @@ public class ItemImage extends BaseEntity {
private Long id;
private String itemImageUrl;

@OneToOne
@JoinColumn(name = "item_id")
private Item item;
private String itemName;

@Enumerated(EnumType.STRING)
private ItemType itemType;

private Long requiredLevel;

@OneToMany(mappedBy = "itemImage")
private List<Item> item = new ArrayList<>();

@Builder
public ItemImage(String itemImageUrl, Item item) {
this.itemImageUrl = itemImageUrl;
this.item = item;
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.noplanb.domain.item.domain;
package com.noplanb.domain.item_image.domain;

public enum ItemType {
// 카테고리-헤어
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ItemImageRepository extends JpaRepository<ItemImage,Long> {
ItemImage findItemImageByItem(Item item);
Expand Down

0 comments on commit f22fb82

Please sign in to comment.