Skip to content

Commit

Permalink
Feature/3rd year (#235)
Browse files Browse the repository at this point in the history
* third annual activity first
  • Loading branch information
yuanmomo committed Apr 21, 2024
1 parent 958c123 commit 7244598
Show file tree
Hide file tree
Showing 26 changed files with 1,019 additions and 12 deletions.
5 changes: 5 additions & 0 deletions deploy/docker-compose-backend-app.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,14 @@ services:
# Telegram
- TG_BOT_TOKEN=
- TG_DAPP_LEARNING_GROUP_ID=
- TELEGRAM_INVITE_URL=
# Discord
- DISCORD_BOT_TOKEN=
- GUILD_DAPP_LEARNING_ID=
- DISCORD_CHANNEL_MANAGEMENT_CLIENT_ID=
- DISCORD_CHANNEL_MANAGEMENT_CLIENT_SECRET=
- DISCORD_CHANNEL_MANAGEMENT_CALLBACK_URL=
- DISCORD_INVITE_URL=
# CRON
- CRON_REDPACKET=
- CRON_DIS=
Expand Down
76 changes: 76 additions & 0 deletions src/main/java/com/dl/officialsite/activity/ActivityController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.dl.officialsite.activity;

import com.dl.officialsite.activity.config.ActivityConfig;
import com.dl.officialsite.activity.config.Task;
import com.dl.officialsite.activity.constant.TaskTypeEnum;
import com.dl.officialsite.activity.service.MemberTaskService;
import com.dl.officialsite.common.base.BaseResponse;
import com.dl.officialsite.common.utils.HttpSessionUtils;
import com.dl.officialsite.login.model.SessionUserInfo;
import com.dl.officialsite.member.Member;
import com.dl.officialsite.member.MemberRepository;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
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.Optional;

/**
* 活动模块
*/
@RestController
@RequestMapping("/activity")
@Slf4j
public class ActivityController {
@Autowired
private MemberTaskService memberTaskService;
@Autowired
private MemberRepository memberRepository;
@Autowired
private ActivityConfig activityConfig;

/**
* 获取活动中用户的状态
*/
@GetMapping("/status")
public BaseResponse fetchMemberTasksStatus(@RequestParam(required = false) String addressForTesting, HttpSession session) {
SessionUserInfo sessionUserInfo = HttpSessionUtils.getMember(session);
final String address = sessionUserInfo != null ? sessionUserInfo.getAddress() : addressForTesting;

Optional<Member> memberOptional = memberRepository.findByAddress(address);
return BaseResponse.successWithData(memberTaskService.getMemberTasksStatusByAddress(address, memberOptional));
}

/**
* 检查用户是否完成任务
*/
@PostMapping("/check")
public BaseResponse checkTask(@NotNull @RequestParam("taskType") TaskTypeEnum taskType, @NotNull @RequestParam("target") String target,
@RequestParam(required = false) String addressForTesting, HttpSession session) {
if (taskType == null) {
return BaseResponse.failWithReason("1201", "Parameter [taskType] should not be null.");
}
if (StringUtils.isBlank(target)) {
return BaseResponse.failWithReason("1201", "Parameter [target] should not be null.");
}
Optional<Task> task = activityConfig.findTask(taskType, target);
if (!task.isPresent()) {
return BaseResponse.failWithReason("1201", String.format("Task [%s:%s] is not defined.", taskType, target));
}

SessionUserInfo sessionUserInfo = HttpSessionUtils.getMember(session);
final String address = sessionUserInfo != null ? sessionUserInfo.getAddress() : addressForTesting;

Optional<Member> memberOptional = memberRepository.findByAddress(address);
return memberOptional.map(member -> memberTaskService.checkStatus(member, address, taskType, task.get()))
.orElseGet(() -> BaseResponse.failWithReason("1001", "no user found")); // 用户需要注册
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.dl.officialsite.activity.bean;


import com.dl.officialsite.activity.constant.TaskTypeEnum;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@EntityListeners(AuditingEntityListener.class)
@Entity
@DynamicUpdate
@Table(name = "member_task_record", schema = "dl", uniqueConstraints = {
@UniqueConstraint(name = "unique_task_record", columnNames = {
"address","activityName", "taskType", "target"
})
})
public class MemberTaskRecord implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(length = 42)
@NotNull
private String address;

@Column(length = 32)
@NotNull
private String activityName;

@NotNull
@Column(length = 16)
@Enumerated(EnumType.STRING)
private TaskTypeEnum taskType;

@NotNull
@Column(length = 64)
private String target;

private boolean finished = false;

@CreatedDate
@Column(updatable = false)
private Long finishTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.dl.officialsite.activity.bean;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface MemberTaskRecordRepository extends JpaRepository<MemberTaskRecord, Long>, JpaSpecificationExecutor<MemberTaskRecord> {


@Query(value = "select * from member_task_record where address = :address and activity_name=:activityName", nativeQuery = true)
List<MemberTaskRecord> findActivityRecordsByAddress(@Param("activityName") String activityName, @Param("address") String address);

@Query(value = "select * from member_task_record where address = :address and activity_name=:activityName and " +
"task_type=:taskType and target=:target", nativeQuery = true)
List<MemberTaskRecord> findByAddressAndActivityNameAndTaskTypeAndTarget(@Param("address") String address,
@Param("activityName") String activityName,
@Param("taskType") String taskType,
@Param("target") String target);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.dl.officialsite.activity.bean;


import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@EntityListeners(AuditingEntityListener.class)
@Entity
@DynamicUpdate
@Table(name = "reward_distribute_record", schema = "dl", uniqueConstraints = {
@UniqueConstraint(name = "unique_task_record", columnNames = {
"address","activityName"
})
})
public class RewardDistributeRecord implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(length = 42)
@NotNull
private String address;

@Column(length = 32)
@NotNull
private String activityName;

private boolean rewardDistributed = false;

@Column(length = 128)
@NotNull
private String reward;

@CreatedDate
@Column(updatable = false)
private Long distributedTime;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.dl.officialsite.activity.config;

import com.dl.officialsite.activity.constant.TaskTypeEnum;
import com.dl.officialsite.activity.model.MemberTaskStatus;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@Slf4j
@Data
@EqualsAndHashCode(callSuper = false)
@ToString
@Configuration
@ConfigurationProperties(prefix = "activity", ignoreInvalidFields = true)
public class ActivityConfig {
private String name;
private Map<TaskTypeEnum, List<Task>> taskMap;

private static long taskCount;

@PostConstruct
public void init() {
taskCount = Optional.of(taskMap).orElse(Collections.emptyMap()).values().stream().
map(Collection::size).mapToInt(Integer::intValue).sum();

log.info("Init ActivityConfig:[{}], taskCount:[{}]", this, taskCount);
}

public Optional<Task> findTask(TaskTypeEnum taskType, String target) {
return Optional.ofNullable(taskMap.get(taskType))
.flatMap(list -> list.stream().filter(task -> StringUtils.equalsIgnoreCase(task.getTarget(), target))
.reduce((a, b) -> {
throw new IllegalStateException("Shouldn't be multiple records");
}));
}

public List<MemberTaskStatus> fetchMemberTaskStatusList() {
return taskMap.entrySet().stream().flatMap(entry ->
entry.getValue().stream().map(task -> new MemberTaskStatus(entry.getKey(), task.getName(), task.getTarget(),
task.getTargetUrl()))
).collect(Collectors.toList());
}

}
10 changes: 10 additions & 0 deletions src/main/java/com/dl/officialsite/activity/config/Task.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.dl.officialsite.activity.config;

import lombok.Data;

@Data
public class Task {
private String name;
private String target;
private String targetUrl;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.dl.officialsite.activity.constant;

import lombok.Getter;

@Getter
public enum TaskTypeEnum {
GIT_HUB("GitHub"),
TELEGRAM("Telegram"),
DISCORD("Discord");

private String value;

private TaskTypeEnum(String value) {
this.value = value;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.dl.officialsite.activity.model;

import com.dl.officialsite.activity.constant.TaskTypeEnum;
import lombok.Data;

@Data
public class MemberTaskStatus {
private TaskTypeEnum taskType;
private String taskName;
private String target;
private String targetUrl;

private boolean requiredAuthorization = true;
private boolean finished = false;

public MemberTaskStatus() {
}

public MemberTaskStatus(TaskTypeEnum taskType, String taskName, String target, String targetUrl) {
this.taskType = taskType;
this.taskName = taskName;
this.target = target;
this.targetUrl = targetUrl;
}
}
Loading

0 comments on commit 7244598

Please sign in to comment.