diff --git a/src/main/java/com/mosquito/project/service/ActivityService.java b/src/main/java/com/mosquito/project/service/ActivityService.java index b7a7539..bfa85ff 100644 --- a/src/main/java/com/mosquito/project/service/ActivityService.java +++ b/src/main/java/com/mosquito/project/service/ActivityService.java @@ -12,6 +12,9 @@ import com.mosquito.project.exception.FileUploadException; import com.mosquito.project.exception.InvalidActivityDataException; import com.mosquito.project.exception.UserNotAuthorizedForActivityException; import org.springframework.cache.annotation.Cacheable; +import com.mosquito.project.persistence.entity.ActivityEntity; +import com.mosquito.project.persistence.repository.ActivityRepository; +import java.time.ZoneOffset; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -43,54 +46,81 @@ public class ActivityService { private final AtomicLong apiKeyIdCounter = new AtomicLong(); private final DelayProvider delayProvider; + private final ActivityRepository activityRepository; - public ActivityService(DelayProvider delayProvider) { + public ActivityService(DelayProvider delayProvider, ActivityRepository activityRepository) { this.delayProvider = delayProvider; + this.activityRepository = activityRepository; } public Activity createActivity(CreateActivityRequest request) { if (request.getEndTime().isBefore(request.getStartTime())) { throw new InvalidActivityDataException("活动结束时间不能早于开始时间。"); } + ActivityEntity entity = new ActivityEntity(); + entity.setName(request.getName()); + entity.setStartTimeUtc(request.getStartTime().withZoneSameInstant(ZoneOffset.UTC).toOffsetDateTime()); + entity.setEndTimeUtc(request.getEndTime().withZoneSameInstant(ZoneOffset.UTC).toOffsetDateTime()); + entity.setRewardCalculationMode("delta"); + entity.setStatus("draft"); + entity.setCreatedAt(java.time.OffsetDateTime.now(ZoneOffset.UTC)); + entity.setUpdatedAt(java.time.OffsetDateTime.now(ZoneOffset.UTC)); + entity = activityRepository.save(entity); + Activity activity = new Activity(); - long newId = activityIdCounter.incrementAndGet(); - activity.setId(newId); + activity.setId(entity.getId()); activity.setName(request.getName()); activity.setStartTime(request.getStartTime()); activity.setEndTime(request.getEndTime()); - - activities.put(newId, activity); + activities.put(activity.getId(), activity); return activity; } public Activity updateActivity(Long id, UpdateActivityRequest request) { - Activity activity = activities.get(id); - if (activity == null) { - throw new ActivityNotFoundException("活动不存在。"); - } + ActivityEntity entity = activityRepository.findById(id) + .orElseThrow(() -> new ActivityNotFoundException("活动不存在。")); if (request.getEndTime().isBefore(request.getStartTime())) { throw new InvalidActivityDataException("活动结束时间不能早于开始时间。"); } + entity.setName(request.getName()); + entity.setStartTimeUtc(request.getStartTime().withZoneSameInstant(ZoneOffset.UTC).toOffsetDateTime()); + entity.setEndTimeUtc(request.getEndTime().withZoneSameInstant(ZoneOffset.UTC).toOffsetDateTime()); + entity.setUpdatedAt(java.time.OffsetDateTime.now(ZoneOffset.UTC)); + activityRepository.save(entity); + + Activity activity = new Activity(); + activity.setId(entity.getId()); activity.setName(request.getName()); activity.setStartTime(request.getStartTime()); activity.setEndTime(request.getEndTime()); - activities.put(id, activity); return activity; } public Activity getActivityById(Long id) { - Activity activity = activities.get(id); - if (activity == null) { - throw new ActivityNotFoundException("活动不存在。"); - } + ActivityEntity entity = activityRepository.findById(id) + .orElseThrow(() -> new ActivityNotFoundException("活动不存在。")); + Activity activity = new Activity(); + activity.setId(entity.getId()); + activity.setName(entity.getName()); + activity.setStartTime(entity.getStartTimeUtc().atZoneSameInstant(ZoneOffset.UTC)); + activity.setEndTime(entity.getEndTimeUtc().atZoneSameInstant(ZoneOffset.UTC)); return activity; } public List getAllActivities() { - return new ArrayList<>(activities.values()); + List result = new ArrayList<>(); + for (ActivityEntity e : activityRepository.findAll()) { + Activity a = new Activity(); + a.setId(e.getId()); + a.setName(e.getName()); + a.setStartTime(e.getStartTimeUtc().atZoneSameInstant(ZoneOffset.UTC)); + a.setEndTime(e.getEndTimeUtc().atZoneSameInstant(ZoneOffset.UTC)); + result.add(a); + } + return result; } public String generateApiKey(CreateApiKeyRequest request) { @@ -214,7 +244,7 @@ public class ActivityService { @Cacheable(value = "leaderboards", key = "#activityId") public List getLeaderboard(Long activityId) { - if (!activities.containsKey(activityId)) { + if (!activityRepository.existsById(activityId)) { throw new ActivityNotFoundException("活动不存在。"); } // Simulate fetching and ranking data @@ -232,7 +262,7 @@ public class ActivityService { } public ActivityStatsResponse getActivityStats(Long activityId) { - if (!activities.containsKey(activityId)) { + if (!activityRepository.existsById(activityId)) { throw new ActivityNotFoundException("活动不存在。"); } @@ -246,7 +276,7 @@ public class ActivityService { } public ActivityGraphResponse getActivityGraph(Long activityId) { - if (!activities.containsKey(activityId)) { + if (!activityRepository.existsById(activityId)) { throw new ActivityNotFoundException("活动不存在。"); }