dynamodb 페이징 처리
This commit is contained in:
@@ -31,6 +31,8 @@ public class UsersResponse {
|
|||||||
|
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
|
@JsonProperty("user_session")
|
||||||
|
private boolean userSession;
|
||||||
@JsonProperty("user_info")
|
@JsonProperty("user_info")
|
||||||
private UserInfo userInfo;
|
private UserInfo userInfo;
|
||||||
@JsonProperty("char_info")
|
@JsonProperty("char_info")
|
||||||
|
|||||||
@@ -4,16 +4,23 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import com.caliverse.admin.domain.entity.FriendRequest;
|
import com.caliverse.admin.domain.entity.FriendRequest;
|
||||||
import com.caliverse.admin.domain.entity.HISTORYTYPE;
|
import com.caliverse.admin.domain.entity.HISTORYTYPE;
|
||||||
import com.caliverse.admin.domain.request.MailRequest;
|
import com.caliverse.admin.domain.request.MailRequest;
|
||||||
|
import com.caliverse.admin.dynamodb.domain.atrrib.MailAttrib;
|
||||||
|
import com.caliverse.admin.dynamodb.domain.doc.MailDoc;
|
||||||
|
import com.caliverse.admin.dynamodb.dto.PageResult;
|
||||||
|
import com.caliverse.admin.dynamodb.service.DynamodbService;
|
||||||
import com.caliverse.admin.redis.service.RedisUserInfoService;
|
import com.caliverse.admin.redis.service.RedisUserInfoService;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.caliverse.admin.domain.datacomponent.MetaDataHandler;
|
import com.caliverse.admin.domain.datacomponent.MetaDataHandler;
|
||||||
@@ -34,6 +41,7 @@ public class UsersService {
|
|||||||
private static final Logger logger = LoggerFactory.getLogger(UsersService.class);
|
private static final Logger logger = LoggerFactory.getLogger(UsersService.class);
|
||||||
|
|
||||||
private final DynamoDBService dynamoDBService;
|
private final DynamoDBService dynamoDBService;
|
||||||
|
private final DynamodbService dynamodbService;
|
||||||
private final HistoryService historyService;
|
private final HistoryService historyService;
|
||||||
private final UserGameSessionService userGameSessionService;
|
private final UserGameSessionService userGameSessionService;
|
||||||
private final RedisUserInfoService redisUserInfoService;
|
private final RedisUserInfoService redisUserInfoService;
|
||||||
@@ -41,6 +49,9 @@ public class UsersService {
|
|||||||
//metadataHandler 어떻게 가져와야 되는가
|
//metadataHandler 어떻게 가져와야 되는가
|
||||||
@Autowired
|
@Autowired
|
||||||
private MetaDataHandler metaDataHandler;
|
private MetaDataHandler metaDataHandler;
|
||||||
|
@Qualifier("objectMapper")
|
||||||
|
@Autowired
|
||||||
|
private ObjectMapper objectMapper;
|
||||||
|
|
||||||
// 닉네임 변경
|
// 닉네임 변경
|
||||||
public UsersResponse changeNickname(UsersRequest usersRequest){
|
public UsersResponse changeNickname(UsersRequest usersRequest){
|
||||||
@@ -279,12 +290,52 @@ public class UsersService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public UsersResponse getMail(String guid, String type){
|
public UsersResponse getMail(String guid, String type){
|
||||||
|
// List<UsersResponse.Mail> mailList = dynamoDBService.getMail(guid, type);
|
||||||
|
PageResult<MailDoc> mailPageResult = dynamodbService.getMail(type, guid, "", "", "", null, false);
|
||||||
|
List<UsersResponse.Mail> mailList = new ArrayList<>();
|
||||||
|
|
||||||
List<UsersResponse.Mail> mailList = dynamoDBService.getMail(guid, type);;
|
mailPageResult.getItems().forEach(doc -> {
|
||||||
|
try {
|
||||||
|
MailAttrib attrib = objectMapper.readValue(doc.getAttribValue(), MailAttrib.class);
|
||||||
|
|
||||||
|
List<UsersResponse.MailItem> itemList = new ArrayList<>();
|
||||||
|
attrib.getItemList().forEach(item -> {
|
||||||
|
UsersResponse.MailItem mailItem = new UsersResponse.MailItem();
|
||||||
|
mailItem.setItemId(CommonUtils.objectToString(item.getItemId()));
|
||||||
|
mailItem.setCount(item.getCount());
|
||||||
|
String item_nm = metaDataHandler.getMetaItemNameData(item.getItemId());
|
||||||
|
mailItem.setItemName(metaDataHandler.getTextStringData(item_nm));
|
||||||
|
itemList.add(mailItem);
|
||||||
|
});
|
||||||
|
|
||||||
|
UsersResponse.Mail mail = UsersResponse.Mail.builder()
|
||||||
|
.mailGuid(attrib.getMailGuid())
|
||||||
|
.title(attrib.getTitle())
|
||||||
|
.content(attrib.getText())
|
||||||
|
.senderNickname(attrib.getSenderNickName())
|
||||||
|
.receiveNickname(attrib.getReceiverNickName())
|
||||||
|
.status(attrib.isRead())
|
||||||
|
.isSystemMail(attrib.isSystemMail())
|
||||||
|
.isGetItem(attrib.isGetItem())
|
||||||
|
.createDt(attrib.getCreateTime())
|
||||||
|
.mailItemList(itemList)
|
||||||
|
.build();
|
||||||
|
mailList.add(mail);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(e.getMessage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
return UsersResponse.builder()
|
return UsersResponse.builder()
|
||||||
.resultData(
|
.resultData(
|
||||||
UsersResponse.ResultData.builder()
|
UsersResponse.ResultData.builder()
|
||||||
.mailList(mailList)
|
.mailList(mailList)
|
||||||
|
.pageKey(mailPageResult.getLastEvaluatedKey().entrySet().stream()
|
||||||
|
.collect(Collectors.toMap(
|
||||||
|
Map.Entry::getKey,
|
||||||
|
entry -> entry.getValue().s()
|
||||||
|
))
|
||||||
|
)
|
||||||
.build()
|
.build()
|
||||||
)
|
)
|
||||||
.status(CommonCode.SUCCESS.getHttpStatus())
|
.status(CommonCode.SUCCESS.getHttpStatus())
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.caliverse.admin.dynamodb.domain.atrrib;
|
package com.caliverse.admin.dynamodb.domain.atrrib;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
|
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonNaming;
|
import com.fasterxml.jackson.databind.annotation.JsonNaming;
|
||||||
@@ -11,6 +12,7 @@ import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean;
|
|||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
|
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
|
||||||
|
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||||
public abstract class DynamoDBAttribBase {
|
public abstract class DynamoDBAttribBase {
|
||||||
//객체일때는 사용안하고 Json으로 Attrib이 생성될때만 사용(상속 안받는걸로)
|
//객체일때는 사용안하고 Json으로 Attrib이 생성될때만 사용(상속 안받는걸로)
|
||||||
@JsonProperty("attrib_type")
|
@JsonProperty("attrib_type")
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package com.caliverse.admin.dynamodb.dto;
|
||||||
|
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class PageResult<T> {
|
||||||
|
private final List<T> items;
|
||||||
|
private final Map<String, AttributeValue> lastEvaluatedKey;
|
||||||
|
|
||||||
|
public PageResult(List<T> items, Map<String, AttributeValue> lastEvaluatedKey) {
|
||||||
|
this.items = items;
|
||||||
|
this.lastEvaluatedKey = lastEvaluatedKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> getItems() {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, AttributeValue> getLastEvaluatedKey() {
|
||||||
|
return lastEvaluatedKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasMorePages() {
|
||||||
|
return lastEvaluatedKey != null && !lastEvaluatedKey.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,15 @@
|
|||||||
package com.caliverse.admin.dynamodb.entity;
|
package com.caliverse.admin.dynamodb.entity;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
public class MailItem {
|
public class MailItem {
|
||||||
@JsonProperty("ItemId")
|
@JsonProperty("ItemId")
|
||||||
private Integer itemId;
|
private Integer itemId;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.caliverse.admin.dynamodb.repository;
|
package com.caliverse.admin.dynamodb.repository;
|
||||||
|
|
||||||
|
import com.caliverse.admin.dynamodb.dto.PageResult;
|
||||||
import com.caliverse.admin.dynamodb.service.DynamoDBOperations;
|
import com.caliverse.admin.dynamodb.service.DynamoDBOperations;
|
||||||
import com.caliverse.admin.global.common.code.CommonCode;
|
import com.caliverse.admin.global.common.code.CommonCode;
|
||||||
import com.caliverse.admin.global.common.code.ErrorCode;
|
import com.caliverse.admin.global.common.code.ErrorCode;
|
||||||
@@ -10,8 +11,10 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import software.amazon.awssdk.enhanced.dynamodb.Expression;
|
import software.amazon.awssdk.enhanced.dynamodb.Expression;
|
||||||
import software.amazon.awssdk.enhanced.dynamodb.Key;
|
import software.amazon.awssdk.enhanced.dynamodb.Key;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public abstract class BaseDynamoDBRepository<T> implements DynamoDBRepository<T> {
|
public abstract class BaseDynamoDBRepository<T> implements DynamoDBRepository<T> {
|
||||||
@@ -87,4 +90,25 @@ public abstract class BaseDynamoDBRepository<T> implements DynamoDBRepository<T>
|
|||||||
return operations.getItemsByPrefix(partitionKey, sortKeyPrefix, entityClass);
|
return operations.getItemsByPrefix(partitionKey, sortKeyPrefix, entityClass);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<T> findByPaging(
|
||||||
|
String partitionKey,
|
||||||
|
String sortKeyPrefix,
|
||||||
|
String filterAttributeName,
|
||||||
|
String filterAttributeValue,
|
||||||
|
Map<String, AttributeValue> exclusiveStartKey,
|
||||||
|
boolean scanIndexForward
|
||||||
|
) {
|
||||||
|
|
||||||
|
return operations.queryItemsPaging(
|
||||||
|
partitionKey,
|
||||||
|
sortKeyPrefix,
|
||||||
|
filterAttributeName,
|
||||||
|
filterAttributeValue,
|
||||||
|
exclusiveStartKey,
|
||||||
|
scanIndexForward,
|
||||||
|
entityClass
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package com.caliverse.admin.dynamodb.repository;
|
package com.caliverse.admin.dynamodb.repository;
|
||||||
|
|
||||||
|
import com.caliverse.admin.dynamodb.dto.PageResult;
|
||||||
import software.amazon.awssdk.enhanced.dynamodb.Expression;
|
import software.amazon.awssdk.enhanced.dynamodb.Expression;
|
||||||
import software.amazon.awssdk.enhanced.dynamodb.Key;
|
import software.amazon.awssdk.enhanced.dynamodb.Key;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface DynamoDBRepository<T> {
|
public interface DynamoDBRepository<T> {
|
||||||
void save(T item);
|
void save(T item);
|
||||||
@@ -17,4 +20,13 @@ public interface DynamoDBRepository<T> {
|
|||||||
List<T> findAllScan(String prefix);
|
List<T> findAllScan(String prefix);
|
||||||
List<T> findAllScan(String prefix, String sortKey);
|
List<T> findAllScan(String prefix, String sortKey);
|
||||||
List<T> findByPrefix(String partitionKey, String sortKeyPrefix);
|
List<T> findByPrefix(String partitionKey, String sortKeyPrefix);
|
||||||
|
|
||||||
|
PageResult<T> findByPaging(
|
||||||
|
String partitionKey,
|
||||||
|
String sortKeyPrefix,
|
||||||
|
String filterAttributeName,
|
||||||
|
String filterAttributeValue,
|
||||||
|
Map<String, AttributeValue> exclusiveStartKey,
|
||||||
|
boolean scanIndexForward
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,11 @@ package com.caliverse.admin.dynamodb.repository.Impl;
|
|||||||
|
|
||||||
import com.caliverse.admin.domain.entity.HISTORYTYPE;
|
import com.caliverse.admin.domain.entity.HISTORYTYPE;
|
||||||
import com.caliverse.admin.domain.entity.Mail;
|
import com.caliverse.admin.domain.entity.Mail;
|
||||||
|
import com.caliverse.admin.domain.entity.SEARCHTYPE;
|
||||||
import com.caliverse.admin.domain.entity.metadata.MetaSystemMailData;
|
import com.caliverse.admin.domain.entity.metadata.MetaSystemMailData;
|
||||||
import com.caliverse.admin.dynamodb.domain.atrrib.MailAttrib;
|
import com.caliverse.admin.dynamodb.domain.atrrib.MailAttrib;
|
||||||
import com.caliverse.admin.dynamodb.domain.doc.MailDoc;
|
import com.caliverse.admin.dynamodb.domain.doc.MailDoc;
|
||||||
|
import com.caliverse.admin.dynamodb.dto.PageResult;
|
||||||
import com.caliverse.admin.dynamodb.entity.MailItem;
|
import com.caliverse.admin.dynamodb.entity.MailItem;
|
||||||
import com.caliverse.admin.dynamodb.repository.BaseDynamoDBRepository;
|
import com.caliverse.admin.dynamodb.repository.BaseDynamoDBRepository;
|
||||||
import com.caliverse.admin.dynamodb.repository.MailRepository;
|
import com.caliverse.admin.dynamodb.repository.MailRepository;
|
||||||
@@ -19,12 +21,13 @@ import com.caliverse.admin.history.service.DynamodbHistoryLogService;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.caliverse.admin.global.common.utils.CommonUtils.convertUTCDate;
|
import static com.caliverse.admin.global.common.utils.CommonUtils.convertUTCDate;
|
||||||
import static com.caliverse.admin.global.common.utils.DynamodbUtil.createMailItems;
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -94,4 +97,47 @@ public class MailRepositoryImpl extends BaseDynamoDBRepository<MailDoc> implemen
|
|||||||
public void insertSentMail(Mail mail) {
|
public void insertSentMail(Mail mail) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<MailDoc> getMailList(String type, String userGuid, String sortKeyPrefix) {
|
||||||
|
String pk;
|
||||||
|
|
||||||
|
if(type.equals(SEARCHTYPE.SEND.name())){
|
||||||
|
pk = DynamoDBConstants.PK_KEY_RECV_MAIL + userGuid;
|
||||||
|
}else{
|
||||||
|
pk = DynamoDBConstants.PK_KEY_SENT_MAIL + userGuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MailDoc> mailList = findByPrefix(pk, sortKeyPrefix);
|
||||||
|
|
||||||
|
return mailList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<MailDoc> getMailListWithPaging(
|
||||||
|
String type,
|
||||||
|
String userGuid,
|
||||||
|
String sortKeyPrefix,
|
||||||
|
String filterAttributeName,
|
||||||
|
String filterAttributeValue,
|
||||||
|
Map<String, AttributeValue> exclusiveStartKey,
|
||||||
|
boolean sortIndex
|
||||||
|
) {
|
||||||
|
|
||||||
|
String pk;
|
||||||
|
if(type.equals(SEARCHTYPE.SEND.name())){
|
||||||
|
pk = DynamoDBConstants.PK_KEY_SENT_MAIL + userGuid;
|
||||||
|
} else {
|
||||||
|
pk = DynamoDBConstants.PK_KEY_RECV_MAIL + userGuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return findByPaging(
|
||||||
|
pk,
|
||||||
|
sortKeyPrefix,
|
||||||
|
filterAttributeName,
|
||||||
|
filterAttributeValue,
|
||||||
|
exclusiveStartKey,
|
||||||
|
sortIndex
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,24 @@ import com.caliverse.admin.domain.entity.Mail;
|
|||||||
import com.caliverse.admin.domain.entity.metadata.MetaSystemMailData;
|
import com.caliverse.admin.domain.entity.metadata.MetaSystemMailData;
|
||||||
import com.caliverse.admin.domain.request.MailRequest;
|
import com.caliverse.admin.domain.request.MailRequest;
|
||||||
import com.caliverse.admin.dynamodb.domain.doc.MailDoc;
|
import com.caliverse.admin.dynamodb.domain.doc.MailDoc;
|
||||||
|
import com.caliverse.admin.dynamodb.dto.PageResult;
|
||||||
import com.caliverse.admin.dynamodb.entity.MailItem;
|
import com.caliverse.admin.dynamodb.entity.MailItem;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface MailRepository extends DynamoDBRepository<MailDoc> {
|
public interface MailRepository extends DynamoDBRepository<MailDoc> {
|
||||||
void insertRecvSystemMail(String userGuid, String nickname, List<MailItem> mailItems, MetaSystemMailData systemMailData, List<String> arguments);
|
void insertRecvSystemMail(String userGuid, String nickname, List<MailItem> mailItems, MetaSystemMailData systemMailData, List<String> arguments);
|
||||||
void insertSentMail(Mail mail);
|
void insertSentMail(Mail mail);
|
||||||
|
List<MailDoc> getMailList(String type, String userGuid, String sortKeyPrefix);
|
||||||
|
PageResult<MailDoc> getMailListWithPaging(
|
||||||
|
String type,
|
||||||
|
String userGuid,
|
||||||
|
String sortKeyPrefix,
|
||||||
|
String filterAttributeName,
|
||||||
|
String filterAttributeValue,
|
||||||
|
Map<String, AttributeValue> exclusiveStartKey,
|
||||||
|
boolean sortIndex
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.caliverse.admin.dynamodb.service;
|
package com.caliverse.admin.dynamodb.service;
|
||||||
|
|
||||||
|
import com.caliverse.admin.dynamodb.dto.PageResult;
|
||||||
|
import com.caliverse.admin.global.common.constants.CommonConstants;
|
||||||
import com.caliverse.admin.global.component.transaction.DynamoDBTransactionContext;
|
import com.caliverse.admin.global.component.transaction.DynamoDBTransactionContext;
|
||||||
import com.caliverse.admin.global.common.code.CommonCode;
|
import com.caliverse.admin.global.common.code.CommonCode;
|
||||||
import com.caliverse.admin.global.common.exception.RestApiException;
|
import com.caliverse.admin.global.common.exception.RestApiException;
|
||||||
@@ -17,7 +19,9 @@ import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
|||||||
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -265,11 +269,6 @@ public class DynamoDBOperations {
|
|||||||
public <T> List<T> getItemsByPrefix(String partitionKey, String sortKeyPrefix, Class<T> itemClass) {
|
public <T> List<T> getItemsByPrefix(String partitionKey, String sortKeyPrefix, Class<T> itemClass) {
|
||||||
DynamoDbTable<T> table = getTable(itemClass);
|
DynamoDbTable<T> table = getTable(itemClass);
|
||||||
|
|
||||||
QueryConditional queryConditional = QueryConditional.keyEqualTo(b -> b
|
|
||||||
.partitionValue(partitionKey)
|
|
||||||
.sortValue(sortKeyPrefix)
|
|
||||||
.build());
|
|
||||||
|
|
||||||
return table.query(r -> r
|
return table.query(r -> r
|
||||||
.queryConditional(QueryConditional.sortBeginsWith(b -> b
|
.queryConditional(QueryConditional.sortBeginsWith(b -> b
|
||||||
.partitionValue(partitionKey)
|
.partitionValue(partitionKey)
|
||||||
@@ -293,4 +292,65 @@ public class DynamoDBOperations {
|
|||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <T> PageResult<T> queryItemsPaging(
|
||||||
|
String partitionKey,
|
||||||
|
String sortKeyPrefix,
|
||||||
|
String filterAttributeName,
|
||||||
|
String filterAttributeValue,
|
||||||
|
Map<String, AttributeValue> exclusiveStartKey,
|
||||||
|
boolean scanIndexForward,
|
||||||
|
Class<T> itemClass) {
|
||||||
|
|
||||||
|
int PAGE_SIZE = CommonConstants.DYNAMODB_PAGING_SIZE;
|
||||||
|
DynamoDbTable<T> table = getTable(itemClass);
|
||||||
|
|
||||||
|
QueryConditional queryConditional;
|
||||||
|
|
||||||
|
if (sortKeyPrefix != null && !sortKeyPrefix.isEmpty()) {
|
||||||
|
queryConditional = QueryConditional.sortBeginsWith(b -> b
|
||||||
|
.partitionValue(partitionKey)
|
||||||
|
.sortValue(sortKeyPrefix));
|
||||||
|
} else {
|
||||||
|
queryConditional = QueryConditional.keyEqualTo(b -> b
|
||||||
|
.partitionValue(partitionKey));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 필터
|
||||||
|
Expression filterExpression = null;
|
||||||
|
if (!filterAttributeName.isEmpty() && !filterAttributeValue.isEmpty()) {
|
||||||
|
filterExpression = Expression.builder()
|
||||||
|
.expression("begins_with(#filterAttr, :filterValue)")
|
||||||
|
.putExpressionName("#filterAttr", filterAttributeName)
|
||||||
|
.putExpressionValue(":filterValue", AttributeValue.builder().s(filterAttributeValue).build())
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryEnhancedRequest.Builder requestBuilder = QueryEnhancedRequest.builder()
|
||||||
|
.queryConditional(queryConditional)
|
||||||
|
.scanIndexForward(scanIndexForward)
|
||||||
|
.limit(PAGE_SIZE);
|
||||||
|
|
||||||
|
if (filterExpression != null) {
|
||||||
|
requestBuilder.filterExpression(filterExpression);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 마지막 키 설정 (페이징 시작점)
|
||||||
|
if (exclusiveStartKey != null && !exclusiveStartKey.isEmpty()) {
|
||||||
|
requestBuilder.exclusiveStartKey(exclusiveStartKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
PageIterable<T> pageIterable = table.query(requestBuilder.build());
|
||||||
|
|
||||||
|
List<T> results = new ArrayList<>();
|
||||||
|
Map<String, AttributeValue> lastEvaluatedKey = null; // 다음 페이지 토큰
|
||||||
|
|
||||||
|
// 첫 페이지만 가져옴
|
||||||
|
for (Page<T> page : pageIterable) {
|
||||||
|
results.addAll(page.items());
|
||||||
|
lastEvaluatedKey = page.lastEvaluatedKey();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PageResult<>(results, lastEvaluatedKey);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import com.caliverse.admin.domain.entity.metadata.MetaSystemMailData;
|
|||||||
import com.caliverse.admin.domain.request.LandRequest;
|
import com.caliverse.admin.domain.request.LandRequest;
|
||||||
import com.caliverse.admin.dynamodb.domain.atrrib.MoneyAttrib;
|
import com.caliverse.admin.dynamodb.domain.atrrib.MoneyAttrib;
|
||||||
import com.caliverse.admin.dynamodb.domain.atrrib.UserNicknameRegistryAttrib;
|
import com.caliverse.admin.dynamodb.domain.atrrib.UserNicknameRegistryAttrib;
|
||||||
|
import com.caliverse.admin.dynamodb.domain.doc.MailDoc;
|
||||||
|
import com.caliverse.admin.dynamodb.dto.PageResult;
|
||||||
import com.caliverse.admin.dynamodb.entity.MailItem;
|
import com.caliverse.admin.dynamodb.entity.MailItem;
|
||||||
import com.caliverse.admin.dynamodb.repository.MailRepository;
|
import com.caliverse.admin.dynamodb.repository.MailRepository;
|
||||||
import com.caliverse.admin.dynamodb.repository.MoneyRepository;
|
import com.caliverse.admin.dynamodb.repository.MoneyRepository;
|
||||||
@@ -25,10 +27,12 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
@@ -91,4 +95,9 @@ public class DynamodbService {
|
|||||||
|
|
||||||
mailRepository.insertRecvSystemMail(guid, nickname, items, systemMailData, arguments);
|
mailRepository.insertRecvSystemMail(guid, nickname, items, systemMailData, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PageResult<MailDoc> getMail(String type, String guid, String sortKey, String filterName, String filterValue, Map<String, AttributeValue> pagingKey, boolean sortIndex){
|
||||||
|
PageResult<MailDoc> mailList = mailRepository.getMailListWithPaging(type, guid, sortKey, filterName, filterValue, pagingKey, sortIndex);
|
||||||
|
return mailList;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ public enum ErrorCode {
|
|||||||
NOT_FOUND_USER("ID또는 비밀번호가 일치하지 않습니다."),
|
NOT_FOUND_USER("ID또는 비밀번호가 일치하지 않습니다."),
|
||||||
DUPLICATED_GROUPNAME("동일한 관리자 그룹명이 존재합니다."),
|
DUPLICATED_GROUPNAME("동일한 관리자 그룹명이 존재합니다."),
|
||||||
|
|
||||||
|
FAIL_USER_KICK("유저 킥 실패"),
|
||||||
|
|
||||||
//meta data
|
//meta data
|
||||||
NOT_ITEM("존재하지 않는 아이템코드입니다."),
|
NOT_ITEM("존재하지 않는 아이템코드입니다."),
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ public enum SuccessCode {
|
|||||||
EXCEL_UPLOAD("파일 업로드 하였습니다."),
|
EXCEL_UPLOAD("파일 업로드 하였습니다."),
|
||||||
REGISTRATION("등록 하였습니다."),
|
REGISTRATION("등록 하였습니다."),
|
||||||
ITEM_EXIST("아이템이 존재합니다"),
|
ITEM_EXIST("아이템이 존재합니다"),
|
||||||
|
SUCCESS("성공 하였습니다."),
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ public class AdminConstants {
|
|||||||
public static final String MONGO_DB_KEY_ACTION = "action";
|
public static final String MONGO_DB_KEY_ACTION = "action";
|
||||||
public static final String MONGO_DB_KEY_DOMAIN = "domain";
|
public static final String MONGO_DB_KEY_DOMAIN = "domain";
|
||||||
public static final String MONGO_DB_KEY_SERVER_TYPE = "serverType";
|
public static final String MONGO_DB_KEY_SERVER_TYPE = "serverType";
|
||||||
|
public static final String MONGO_DB_KEY_CREATE_TIME = "createdTime";
|
||||||
|
public static final String MONGO_DB_KEY_IP = "ip";
|
||||||
|
|
||||||
public static final String MONGO_DB_KEY_USER_GUID_LIST = "userGuidList";
|
public static final String MONGO_DB_KEY_USER_GUID_LIST = "userGuidList";
|
||||||
public static final String MONGO_DB_KEY_USER_GUID_LIST_COUNT = "userGuidListCount";
|
public static final String MONGO_DB_KEY_USER_GUID_LIST_COUNT = "userGuidListCount";
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ public class CommonConstants {
|
|||||||
public static final String LAND_AUCTION = "auction";
|
public static final String LAND_AUCTION = "auction";
|
||||||
public static final String LAND_EVENT = "event";
|
public static final String LAND_EVENT = "event";
|
||||||
public static final String SYSTEM_MAIL_LAND_TRANS_KEY = "LandTrans";
|
public static final String SYSTEM_MAIL_LAND_TRANS_KEY = "LandTrans";
|
||||||
|
public static final int DYNAMODB_PAGING_SIZE = 20;
|
||||||
|
|
||||||
public static final String FORMAT_DATE_ISO_DATETIME_MILLIS = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
|
public static final String FORMAT_DATE_ISO_DATETIME_MILLIS = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
|
||||||
public static final String FORMAT_DATE_ISO_DATETIME_MILLIS_NANO = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'";
|
public static final String FORMAT_DATE_ISO_DATETIME_MILLIS_NANO = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'";
|
||||||
|
|||||||
Reference in New Issue
Block a user