Files
operationSystem-back/src/main/java/com/caliverse/admin/domain/service/MetaDataService.java
bcjang 4d7d4bb266 백과사전 api 생성
아이템 백과사전 조회 API 생성
메타데이터 로드 추가
2025-09-04 10:15:24 +09:00

256 lines
11 KiB
Java

package com.caliverse.admin.domain.service;
import com.caliverse.admin.domain.datacomponent.MetaDataHandler;
import com.caliverse.admin.domain.entity.*;
import com.caliverse.admin.domain.entity.metadata.MetaBattleConfigData;
import com.caliverse.admin.domain.entity.metadata.MetaBrandData;
import com.caliverse.admin.domain.entity.metadata.MetaItemData;
import com.caliverse.admin.domain.response.BattleEventResponse;
import com.caliverse.admin.domain.response.DictionaryResponse;
import com.caliverse.admin.global.common.annotation.RequestLog;
import com.caliverse.admin.global.common.code.CommonCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@Slf4j
public class MetaDataService {
@Autowired
private MetaDataHandler metaDataHandler;
public DictionaryResponse getBrandList(){
List<MetaBrandData> list = metaDataHandler.getMetaBrandListData();
List<MetaBrandData> items = list.stream()
.peek(data -> {
String name = metaDataHandler.getTextStringData(data.getBrandName());
data.setBrandDesc(name);
}).toList();
return DictionaryResponse.builder()
.status(CommonCode.SUCCESS.getHttpStatus())
.result(CommonCode.SUCCESS.getResult())
.resultData(DictionaryResponse.ResultData.builder()
.brandList(items)
.build()
)
.build();
}
//아이템 백과사전
@RequestLog
public DictionaryResponse getItemDictList(@RequestParam Map<String, String> requestParam){
String searchType = requestParam.get("search_type");
String searchData = requestParam.get("search_data").trim();
String largeType = requestParam.get("large_type");
String smallType = requestParam.get("small_type");
String brand = requestParam.get("brand");
String gender = requestParam.get("gender");
String orderBy = requestParam.get("orderby");
String pageNo = requestParam.get("page_no");
String pageSize = requestParam.get("page_size");
List<MetaItemData> items = metaDataHandler.getMetaItemListData();
List<ItemDict> itemDictListKo = createItemDictList(items, LANGUAGETYPE.KO, searchType, searchData, largeType, smallType, brand, gender);
List<ItemDict> itemDictListEn = createItemDictList(items, LANGUAGETYPE.EN, searchType, searchData, largeType, smallType, brand, gender);
List<ItemDict> itemDictListJa = createItemDictList(items, LANGUAGETYPE.JA, searchType, searchData, largeType, smallType, brand, gender);
int totalAll = itemDictListKo.size();
if(orderBy != null && !orderBy.isEmpty()) {
Comparator<ItemDict> comparator = null;
if(orderBy.equalsIgnoreCase("ASC")) {
comparator = Comparator.comparing(ItemDict::getItemId);
} else if(orderBy.equalsIgnoreCase("DESC")) {
comparator = Comparator.comparing(ItemDict::getItemId).reversed();
}
if(comparator != null) {
itemDictListKo = itemDictListKo.stream().sorted(comparator).toList();
itemDictListEn = itemDictListEn.stream().sorted(comparator).toList();
itemDictListJa = itemDictListJa.stream().sorted(comparator).toList();
}
}
// 페이징 처리
int currentPageNo = 1;
int currentPageSize = 10; // 기본값
if(pageNo != null && !pageNo.isEmpty()) {
try {
currentPageNo = Integer.parseInt(pageNo);
} catch(NumberFormatException e) {
currentPageNo = 1;
}
}
if(pageSize != null && !pageSize.isEmpty()) {
try {
currentPageSize = Integer.parseInt(pageSize);
} catch(NumberFormatException e) {
currentPageSize = 10;
}
}
// offset 계산
int offset = (currentPageNo - 1) * currentPageSize;
// 페이징 적용
List<ItemDict> pagedItemDictListKo = itemDictListKo.stream()
.skip(offset)
.limit(currentPageSize)
.toList();
List<ItemDict> pagedItemDictListEn = itemDictListEn.stream()
.skip(offset)
.limit(currentPageSize)
.toList();
List<ItemDict> pagedItemDictListJa = itemDictListJa.stream()
.skip(offset)
.limit(currentPageSize)
.toList();
DictionaryResponse.ItemList itemTotalList = DictionaryResponse.ItemList.builder()
.ko(pagedItemDictListKo)
.en(pagedItemDictListEn)
.ja(pagedItemDictListJa)
.build();
return DictionaryResponse.builder()
.status(CommonCode.SUCCESS.getHttpStatus())
.result(CommonCode.SUCCESS.getResult())
.resultData(DictionaryResponse.ResultData.builder()
.itemList(itemTotalList)
.totalAll(totalAll)
.total(pagedItemDictListKo.size())
.pageNo(currentPageNo)
.build()
)
.build();
}
private List<ItemDict> createItemDictList(List<MetaItemData> items, LANGUAGETYPE languageType,
String searchType, String searchData, String largeType,
String smallType, String brand, String gender) {
return items.stream()
.filter(data -> {
boolean result = true;
if(!largeType.equals("ALL")){
result = data.getLargeType().equals(largeType);
}
if(!smallType.equals("ALL")){
result = result && data.getSmallType().equals(smallType);
}
if(!brand.equals("ALL")){
result = result && data.getBrand().equals(Integer.valueOf(brand));
}
if(!gender.equals("ALL")){
result = result && data.getGender().equals(gender);
}
return result;
})
.map(item -> {
String buffName = metaDataHandler.getMetaBuffName(item.getBuffId());
String brandName = metaDataHandler.getMetaBrandName(item.getBrand());
String randomGroupAttribName = metaDataHandler.getMetaAttribData(item.getAttributeRandomGroupId());
String itemSetName = metaDataHandler.getMetaItemSetName(item.getItemSetId());
Integer gachaGroupId = metaDataHandler.getMetaGachaGroupId(item.getGachaGroupId());
String webLink = metaDataHandler.getMetaWebLinkData(item.getProductLink(), languageType);
String currencySellName = metaDataHandler.getMetaCurrencyName(item.getSellId());
String currencyBuyName = metaDataHandler.getMetaCurrencyName(item.getBuyId());
ItemDict.Country country = ItemDict.Country.builder()
.maxCount(item.getMaxCount())
.stackMaxCount(item.getStackMaxCount())
.build();
ItemDict.Attrib attrib = ItemDict.Attrib.builder()
.rarity(item.getRarity())
.defaultAttrib(item.getDefaultAttribute())
.attribRandomGroup(randomGroupAttribName)
.itemSet(metaDataHandler.getTextStringData(itemSetName, languageType))
.buff(metaDataHandler.getTextStringData(buffName, languageType))
.build();
ItemDict.Expire expire = ItemDict.Expire.builder()
.expireType(item.getExpireType())
.expireStartDt(item.getExpireFixedTermStart())
.expireEndDt(item.getExpireFixedTermEnd())
.expireTimeSec(item.getExpireTimeSec())
.build();
ItemDict.Trade trade = ItemDict.Trade.builder()
.userTradable(item.getIsUserTradable())
.cartBuy(item.getIsCartNBuy())
.throwable(item.getIsThrowable())
.systemTradable(item.getIsSystemTradable())
.build();
ItemDict.Etc etc = ItemDict.Etc.builder()
.productLink(webLink)
.propSmallType(item.getPropSmallType())
.gachaGroupId(gachaGroupId)
.ugqAction(item.getUgqAction())
.linkedLand(item.getLinkedLand())
.build();
return ItemDict.builder()
.itemId(item.getItemId())
.itemName(metaDataHandler.getTextStringData(item.getName(), languageType))
.gender(item.getGender())
.typeLarge(item.getLargeType())
.typeSmall(item.getSmallType())
.brand(metaDataHandler.getTextStringData(brandName, languageType))
.sellType(metaDataHandler.getTextStringData(currencySellName, LANGUAGETYPE.KO))
.sellPrice(item.getSellPrice())
.buyType(metaDataHandler.getTextStringData(currencyBuyName, LANGUAGETYPE.KO))
.buyPrice(item.getBuyPrice())
.buyDiscountRate(item.getBuyDiscountRate())
.country(country)
.attrib(attrib)
.expire(expire)
.trade(trade)
.etc(etc)
.build();
}).filter(data -> {
boolean result = true;
if(!searchData.isEmpty()){
if(searchType.equals("NAME")){
result = data.getItemName().contains(searchData);
}
if(searchType.equals("ID")){
result = data.getItemId().toString().equals(searchData);
}
}
return result;
})
.collect(Collectors.toList());
}
}