Skip to content

Commit

Permalink
Merge pull request #20 from lsn5963/feat/calendar
Browse files Browse the repository at this point in the history
달력조회 api
  • Loading branch information
lsn5963 authored Aug 11, 2024
2 parents eb944ad + 8cddbe6 commit fa176fe
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 27 deletions.
7 changes: 3 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ out/

### ELSE ###
application.yml
#application-s3.yml
classpath:/database/application-database.yml
classpath:/oauth2/application-oauth2.yml
classpath:/s3/application-s3.yml
database/application-database.yml
oauth2/application-oauth2.yml
s3/application-s3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,7 @@ public void addItem(Item item){
item.updateCharacter(this);

}
public void updateTodayExp(){
this.todayExp = 0l;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@

import com.noplanb.domain.character.domain.Character;
import com.noplanb.domain.character.repository.CharacterRepository;
import com.noplanb.domain.quest.domain.DailyExperience;
import com.noplanb.domain.quest.domain.Quest;
import com.noplanb.domain.quest.dto.res.RetrieveCalendarRes;
import com.noplanb.domain.quest.repository.DailyExperienceRepository;
import com.noplanb.global.payload.ApiResponse;
import com.noplanb.global.payload.exception.CharacterNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.YearMonth;
import java.util.List;
import java.util.stream.Collectors;
Expand All @@ -21,19 +24,19 @@
@Transactional(readOnly = true)
public class CalendarService {
private final CharacterRepository characterRepository;
private final DailyExperienceRepository dailyExperienceRepository;

public ResponseEntity<?> retrieveQuest(YearMonth date, Long id) {
Character character = characterRepository.findById(id).orElseThrow(CharacterNotFoundException::new);
List<Quest> quests = character.getQuests();
// YearMonth 필터링
List<Quest> filteredByDate = quests.stream()
.filter(quest -> YearMonth.from(quest.getCreatedAt().toLocalDate()).equals(date))
.collect(Collectors.toList());
public ResponseEntity<?> retrieveCalendar(YearMonth date, Long id) {
LocalDate startDate = date.atDay(1);
LocalDate endDate = date.atEndOfMonth();

//그 달의 첫날부터 마지막날까지의 경험치들 가져오기
List<DailyExperience> calendarList = dailyExperienceRepository.findByCharacterIdAndDateBetweenOrderByDateAsc(id, startDate, endDate);

List<RetrieveCalendarRes> calendarRes = filteredByDate.stream().
map(f -> RetrieveCalendarRes.builder()
.id(f.getId())
.exp(f.getExp())
List<RetrieveCalendarRes> calendarRes = calendarList.stream().
map(calendar -> RetrieveCalendarRes.builder()
.date(calendar.getDate())
.exp(calendar.getTodayExp())
.build())
.collect(Collectors.toList());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,35 @@

import com.noplanb.domain.character.domain.Character;
import com.noplanb.domain.character.repository.CharacterRepository;
import com.noplanb.domain.quest.domain.DailyExperience;
import com.noplanb.domain.quest.domain.Quest;
import com.noplanb.domain.quest.dto.req.CreateQuestReq;
import com.noplanb.domain.quest.dto.req.ModifyQuestReq;
import com.noplanb.domain.quest.dto.res.RetrieveLevelAndTodayExpRes;
import com.noplanb.domain.quest.dto.res.RetrieveQuestRes;
import com.noplanb.domain.quest.repository.DailyExperienceRepository;
import com.noplanb.domain.quest.repository.QuestRepository;
import com.noplanb.global.payload.ApiResponse;
import com.noplanb.global.payload.Message;
import com.noplanb.global.payload.exception.CharacterNotFoundException;
import com.noplanb.global.payload.exception.QuestNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static com.noplanb.global.payload.ErrorCode.CHARACTER_NOT_FOUND;


@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class QuestService {
private final CharacterRepository characterRepository;
private final QuestRepository questRepository;
private final DailyExperienceRepository dailyExperienceRepository;

@Transactional
public ResponseEntity<?> createQuest(CreateQuestReq createQuestReq, Long id) {
Expand Down Expand Up @@ -109,6 +106,21 @@ public ResponseEntity<?> deleteQuest(Long userId,Long id) {

return createApiResponse(Message.builder().message("퀘스트를 삭제했습니다.").build());
}
@Transactional
@Scheduled(cron = "0 0 0 * * *")
public void resetDailyExperience() {
List<Character> characters = characterRepository.findAll();
for (Character character : characters) {
// 어제 날짜로 DailyExperience 엔티티에 저장
LocalDate yesterday = LocalDate.now().minusDays(1);
DailyExperience dailyExperience = new DailyExperience(character.getId(), yesterday, character.getTodayExp());
dailyExperienceRepository.save(dailyExperience);

// 사용자 경험치 초기화
character.updateTodayExp();
}
// characterRepository.saveAll(characters);
}
private <T> ResponseEntity<ApiResponse> createApiResponse(T information) {
ApiResponse apiResponse = ApiResponse.builder()
.check(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.noplanb.domain.quest.application.CalendarService;
import com.noplanb.domain.quest.dto.res.RetrieveCalendarRes;
import com.noplanb.domain.quest.dto.res.RetrieveQuestRes;
import com.noplanb.global.payload.ErrorResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
Expand All @@ -19,7 +18,6 @@
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.time.LocalDate;
import java.time.YearMonth;

@Controller
Expand All @@ -38,6 +36,6 @@ public ResponseEntity<?> retrieveCalendar(
// @Parameter(description = "Access Token을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal,
@Parameter(example = "2024-08", description = "날짜를 입력해주세요", required = true) @PathVariable("date") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) YearMonth date,
@Parameter(description = "Access Token을 입력해주세요.", required = true) @PathVariable Long id){
return calendarService.retrieveQuest(date,id);
return calendarService.retrieveCalendar(date,id);
}
}
31 changes: 31 additions & 0 deletions src/main/java/com/noplanb/domain/quest/domain/DailyExperience.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.noplanb.domain.quest.domain;


import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;

import java.time.LocalDate;

@Entity
@Getter
public class DailyExperience {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private Long characterId;
private LocalDate date;
private Long todayExp;

public DailyExperience() {}

public DailyExperience(Long userId, LocalDate date, Long experience) {
this.characterId = userId;
this.date = date;
this.todayExp = experience;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDate;

@Builder
@Getter
public class RetrieveCalendarRes {
@Schema(type = "Long", example = "1", description = "퀘스트 아이디")
private Long id;
@Schema(type = "LocalDate", example = "2024-08-03", description = "달력 날짜")
private LocalDate date;
@Schema(type = "Long", example = "5", description = "퀘스트 경험치")
private Long exp;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.noplanb.domain.quest.repository;

import com.noplanb.domain.quest.domain.DailyExperience;
import org.springframework.data.jpa.repository.JpaRepository;

import java.time.LocalDate;
import java.util.List;

public interface DailyExperienceRepository extends JpaRepository<DailyExperience, Long> {
List<DailyExperience> findByCharacterIdAndDateBetweenOrderByDateAsc(Long characterId, LocalDate startDate, LocalDate endDate);
}

0 comments on commit fa176fe

Please sign in to comment.