diff --git a/src/main/java/com/dl/officialsite/activity/ActivityTestController.java b/src/main/java/com/dl/officialsite/activity/ActivityTestController.java new file mode 100644 index 00000000..9ec3e679 --- /dev/null +++ b/src/main/java/com/dl/officialsite/activity/ActivityTestController.java @@ -0,0 +1,75 @@ +package com.dl.officialsite.activity; + +import com.dl.officialsite.activity.service.MemberTaskService; +import com.dl.officialsite.common.base.BaseResponse; +import com.dl.officialsite.common.exception.BizException; +import com.dl.officialsite.common.utils.HttpSessionUtils; +import com.dl.officialsite.config.ChainConfig; +import com.dl.officialsite.login.model.SessionUserInfo; +import com.dl.officialsite.member.Member; +import com.dl.officialsite.member.MemberRepository; +import com.dl.officialsite.member.MemberService; +import com.dl.officialsite.nft.constant.ContractNameEnum; +import com.dl.officialsite.nft.service.MemberNFTMintService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpSession; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.Optional; + +import static com.dl.officialsite.common.enums.CodeEnums.PARAM_ERROR; + +@RestController +@RequestMapping("/dev/activity/") +@Profile({"dev", "local"}) +@Slf4j +public class ActivityTestController { + @Autowired + private MemberTaskService memberTaskService; + @Autowired + private MemberRepository memberRepository; + @Autowired + private MemberService memberService; + @Autowired + private MemberNFTMintService memberNFTMintService; + @Autowired + private ChainConfig chainConfig; + + /** + * remove the user's activity data for re-testing + */ + @GetMapping("/clean") + public BaseResponse clean(@NotNull @RequestParam("chainId") String chainIdParam, + @RequestParam(required = false) String addressForTesting, + @RequestParam(required = false, defaultValue = "WarCraft") String contractName, + HttpSession session) { + String chainId = Arrays.stream(chainConfig.getIds()).filter(id -> StringUtils.equalsIgnoreCase(chainIdParam, id)) + .findFirst() + .orElseThrow(() -> new BizException(PARAM_ERROR.getCode(), String.format("Chain id %s not exists", chainIdParam))); + + + SessionUserInfo sessionUserInfo = HttpSessionUtils.getMember(session); + final String address = sessionUserInfo != null ? sessionUserInfo.getAddress() : addressForTesting; + + Optional memberOptional = memberRepository.findByAddress(address); + if (!memberOptional.isPresent()) { + BaseResponse.failWithReason("1001", "no user found"); + } + + this.memberTaskService.clean(address); + + this.memberNFTMintService.clean(address, ContractNameEnum.fromValue(contractName), chainId); + + this.memberService.cleanGitHubTgAndDiscordId(address); + + return BaseResponse.success(); + } +} \ No newline at end of file diff --git a/src/main/java/com/dl/officialsite/activity/bean/MemberTaskRecordRepository.java b/src/main/java/com/dl/officialsite/activity/bean/MemberTaskRecordRepository.java index 2dce1b84..d2ca94b7 100644 --- a/src/main/java/com/dl/officialsite/activity/bean/MemberTaskRecordRepository.java +++ b/src/main/java/com/dl/officialsite/activity/bean/MemberTaskRecordRepository.java @@ -2,10 +2,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import javax.transaction.Transactional; import java.util.List; +import java.util.Optional; public interface MemberTaskRecordRepository extends JpaRepository, JpaSpecificationExecutor { @@ -16,8 +19,14 @@ public interface MemberTaskRecordRepository extends JpaRepository findByAddressAndActivityNameAndTaskTypeAndTarget(@Param("address") String address, - @Param("activityName") String activityName, - @Param("taskType") String taskType, - @Param("target") String target); + @Param("activityName") String activityName, + @Param("taskType") String taskType, + @Param("target") String target); + + @Modifying + @Transactional + @Query(value = "delete from member_task_record where address = :address and activity_name=:activityName", nativeQuery = true) + Optional deleteByAddressAndActivityName(@Param("address") String address, + @Param("activityName") String activityName); } diff --git a/src/main/java/com/dl/officialsite/activity/config/ActivityConfig.java b/src/main/java/com/dl/officialsite/activity/config/ActivityConfig.java index f3b7f7f9..e97885d0 100644 --- a/src/main/java/com/dl/officialsite/activity/config/ActivityConfig.java +++ b/src/main/java/com/dl/officialsite/activity/config/ActivityConfig.java @@ -63,7 +63,7 @@ public List fetchMemberTaskStatusList() { return taskTypeEnumListMap.entrySet().stream().flatMap(entry -> entry.getValue().stream().map(task -> new MemberTaskStatus(entry.getKey(), task.getName(), task.getTarget(), - task.getTargetUrl())) + task.getTargetUrl(), task.getDescription())) ).collect(Collectors.toList()); } diff --git a/src/main/java/com/dl/officialsite/activity/config/Task.java b/src/main/java/com/dl/officialsite/activity/config/Task.java index beacb6d0..c8da6c7b 100644 --- a/src/main/java/com/dl/officialsite/activity/config/Task.java +++ b/src/main/java/com/dl/officialsite/activity/config/Task.java @@ -7,4 +7,5 @@ public class Task { private String name; private String target; private String targetUrl; + private String description; } \ No newline at end of file diff --git a/src/main/java/com/dl/officialsite/activity/model/MemberTaskStatus.java b/src/main/java/com/dl/officialsite/activity/model/MemberTaskStatus.java index 2680f794..15064862 100644 --- a/src/main/java/com/dl/officialsite/activity/model/MemberTaskStatus.java +++ b/src/main/java/com/dl/officialsite/activity/model/MemberTaskStatus.java @@ -9,6 +9,7 @@ public class MemberTaskStatus { private String taskName; private String target; private String targetUrl; + private String description; private boolean requiredAuthorization = true; private boolean finished = false; @@ -16,10 +17,11 @@ public class MemberTaskStatus { public MemberTaskStatus() { } - public MemberTaskStatus(TaskTypeEnum taskType, String taskName, String target, String targetUrl) { + public MemberTaskStatus(TaskTypeEnum taskType, String taskName, String target, String targetUrl, String description) { this.taskType = taskType; this.taskName = taskName; this.target = target; this.targetUrl = targetUrl; + this.description = description; } } \ No newline at end of file diff --git a/src/main/java/com/dl/officialsite/activity/service/MemberTaskService.java b/src/main/java/com/dl/officialsite/activity/service/MemberTaskService.java index c9d73140..bbdc0e95 100644 --- a/src/main/java/com/dl/officialsite/activity/service/MemberTaskService.java +++ b/src/main/java/com/dl/officialsite/activity/service/MemberTaskService.java @@ -137,6 +137,11 @@ public List getMemberTasksStatusByAddress(String address, Opti return memberTaskStatuses; } + public void clean(String address) { + int removedCount = this.memberTaskRecordRepository.deleteByAddressAndActivityName(address, activityConfig.getName()).orElse(0); + log.info("Remove {} task records for address {}", removedCount, address); + } + private Optional filter(List memberTaskRecordList, TaskTypeEnum taskTypeEnum, String target) { return memberTaskRecordList.stream() .filter(record -> taskTypeEnum.equals(record.getTaskType())) diff --git a/src/main/java/com/dl/officialsite/member/MemberRepository.java b/src/main/java/com/dl/officialsite/member/MemberRepository.java index 90c4398c..a1fb7f2e 100644 --- a/src/main/java/com/dl/officialsite/member/MemberRepository.java +++ b/src/main/java/com/dl/officialsite/member/MemberRepository.java @@ -2,6 +2,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.transaction.annotation.Transactional; @@ -19,4 +20,10 @@ public interface MemberRepository extends JpaRepository, JpaSpecif Optional findByNickName(@Param("nickName") String nickName); List findByIdIn(List ids); + + @Modifying + @javax.transaction.Transactional + @Query(value = "update member set github_id=NULL, discord_id=NULL, telegram_user_id=NULL where address = :address", nativeQuery = + true) + void removeGitHubTgAndDiscordId(@Param("address") String address); } diff --git a/src/main/java/com/dl/officialsite/member/MemberService.java b/src/main/java/com/dl/officialsite/member/MemberService.java index 9ab68cfe..c50c7ad5 100644 --- a/src/main/java/com/dl/officialsite/member/MemberService.java +++ b/src/main/java/com/dl/officialsite/member/MemberService.java @@ -70,6 +70,11 @@ public MemberVo save(Member member) { } + public void cleanGitHubTgAndDiscordId(String address) { + memberRepository.removeGitHubTgAndDiscordId(address); + log.info("Remove GitHub id, Telegram user id and Discord id to user: {}", address); + } + public MemberVo getMemberPrivacyInfo(String address) { Optional member = memberRepository.findByAddress(address); if (!member.isPresent()) { diff --git a/src/main/java/com/dl/officialsite/nft/bean/MemberNFTMintRecordRepository.java b/src/main/java/com/dl/officialsite/nft/bean/MemberNFTMintRecordRepository.java index ad03fbf1..ca9f6c56 100644 --- a/src/main/java/com/dl/officialsite/nft/bean/MemberNFTMintRecordRepository.java +++ b/src/main/java/com/dl/officialsite/nft/bean/MemberNFTMintRecordRepository.java @@ -2,9 +2,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import javax.transaction.Transactional; import java.util.Optional; public interface MemberNFTMintRecordRepository @@ -15,4 +17,12 @@ public interface MemberNFTMintRecordRepository Optional findByAddressAndContractNameAndChainId(@Param("address") String address, @Param("contractName") String contractName, @Param("chainId") String chainId); + + @Modifying + @Transactional + @Query(value = "delete from member_nft_mint_record where address =:address and contract_name=:contractName and " + + "chain_id=:chainId", nativeQuery = true) + Optional deleteByAddressAndContractNameAndChainId(@Param("address") String address, + @Param("contractName") String contractName, + @Param("chainId") String chainId); } diff --git a/src/main/java/com/dl/officialsite/nft/service/MemberNFTMintService.java b/src/main/java/com/dl/officialsite/nft/service/MemberNFTMintService.java new file mode 100644 index 00000000..988e4b78 --- /dev/null +++ b/src/main/java/com/dl/officialsite/nft/service/MemberNFTMintService.java @@ -0,0 +1,22 @@ +package com.dl.officialsite.nft.service; + +import com.dl.officialsite.nft.bean.MemberNFTMintRecordRepository; +import com.dl.officialsite.nft.constant.ContractNameEnum; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class MemberNFTMintService { + @Autowired + private MemberNFTMintRecordRepository memberNFTMintRecordRepository; + + public void clean(String address, ContractNameEnum contractName, String chainId) { + int removedCount = this.memberNFTMintRecordRepository.deleteByAddressAndContractNameAndChainId(address, + contractName.name(), + chainId).orElse(0); + log.info("Remove {} NFT mint record(s) for address {} and contract {}", removedCount, address, contractName.name()); + } + +} \ No newline at end of file