Skip to content

Commit 229cc11

Browse files
authored
Merge pull request #57 from CommitField/dev
fix : local redis ๋น„ํ™œ์„ฑํ™”, ์‹œํ๋ฆฌํ‹ฐ ์ฃผ์„์ฒ˜๋ฆฌ
2 parents c06d052 + c86ad58 commit 229cc11

30 files changed

+693
-85
lines changed

โ€Ž.DS_Store

6 KB
Binary file not shown.

โ€Žsrc/.DS_Store

6 KB
Binary file not shown.

โ€Žsrc/main/.DS_Store

6 KB
Binary file not shown.

โ€Žsrc/main/java/.DS_Store

6 KB
Binary file not shown.

โ€Žsrc/main/java/cmf/.DS_Store

6 KB
Binary file not shown.
6 KB
Binary file not shown.
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package cmf.commitField.domain.commit.sinceCommit.controller;
2+
3+
import cmf.commitField.domain.commit.sinceCommit.dto.SinceCommitResponseDto;
4+
import cmf.commitField.domain.commit.sinceCommit.service.SinceCommitService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.format.annotation.DateTimeFormat;
7+
import org.springframework.http.ResponseEntity;
8+
import org.springframework.web.bind.annotation.GetMapping;
9+
import org.springframework.web.bind.annotation.RequestParam;
10+
import org.springframework.web.bind.annotation.RestController;
11+
12+
import java.time.LocalDateTime;
13+
import java.time.temporal.TemporalAdjusters;
14+
import java.util.List;
15+
16+
@RestController
17+
@RequiredArgsConstructor
18+
public class SinceCommitController {
19+
private final SinceCommitService sinceCommitService;
20+
21+
@GetMapping("/api/github/commits-since")
22+
public ResponseEntity<List<SinceCommitResponseDto>> getCommits(
23+
@RequestParam String owner,
24+
@RequestParam String repo,
25+
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime since,
26+
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime until
27+
) {
28+
List<SinceCommitResponseDto> sinceCommits = sinceCommitService.getSinceCommits(owner, repo, since, until);
29+
30+
return ResponseEntity.ok(sinceCommits);
31+
}
32+
33+
// ์‹œ์ฆŒ ๋ณ„ ์ปค๋ฐ‹ ์ˆ˜ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
34+
35+
// ๋ด„ ์‹œ์ฆŒ
36+
@GetMapping("/api/github/commits-spring")
37+
public ResponseEntity<List<SinceCommitResponseDto>> getSpringSeasonCommits(
38+
@RequestParam String owner,
39+
@RequestParam String repo
40+
) {
41+
int currentYear = LocalDateTime.now().getYear();
42+
LocalDateTime since = LocalDateTime.of(2024, 3, 1, 0, 0);
43+
LocalDateTime until = LocalDateTime.of(2024, 5, 31, 23, 59, 59);
44+
45+
List<SinceCommitResponseDto> sinceCommits = sinceCommitService.getSinceCommits(owner, repo, since, until);
46+
47+
return ResponseEntity.ok(sinceCommits);
48+
}
49+
50+
// ์—ฌ๋ฆ„ ์‹œ์ฆŒ
51+
@GetMapping("/api/github/commits-summer")
52+
public ResponseEntity<List<SinceCommitResponseDto>> getSummerSeasonCommits(
53+
@RequestParam String owner,
54+
@RequestParam String repo
55+
) {
56+
int currentYear = LocalDateTime.now().getYear();
57+
LocalDateTime since = LocalDateTime.of(currentYear, 6, 1, 0, 0);
58+
LocalDateTime until = LocalDateTime.of(currentYear, 8, 31, 23, 59, 59);
59+
60+
List<SinceCommitResponseDto> sinceCommits = sinceCommitService.getSinceCommits(owner, repo, since, until);
61+
62+
return ResponseEntity.ok(sinceCommits);
63+
}
64+
65+
// ๊ฐ€์„ ์‹œ์ฆŒ
66+
@GetMapping("/api/github/commits-fall")
67+
public ResponseEntity<List<SinceCommitResponseDto>> getFallSeasonCommits(
68+
@RequestParam String owner,
69+
@RequestParam String repo
70+
) {
71+
int currentYear = LocalDateTime.now().getYear();
72+
LocalDateTime since = LocalDateTime.of(currentYear, 9, 1, 0, 0);
73+
LocalDateTime until = LocalDateTime.of(currentYear, 11, 30, 23, 59, 59);
74+
75+
List<SinceCommitResponseDto> sinceCommits = sinceCommitService.getSinceCommits(owner, repo, since, until);
76+
77+
return ResponseEntity.ok(sinceCommits);
78+
}
79+
80+
// ๊ฒจ์šธ ์‹œ์ฆŒ
81+
@GetMapping("/api/github/commits-winter")
82+
public ResponseEntity<List<SinceCommitResponseDto>> getWinterSeasonCommits(
83+
@RequestParam String owner,
84+
@RequestParam String repo
85+
) {
86+
int currentYear = LocalDateTime.now().getYear();
87+
LocalDateTime since = LocalDateTime.of(currentYear, 12, 1, 0, 0);
88+
LocalDateTime until = LocalDateTime.of(currentYear + 1, 2, 1, 23, 59, 59)
89+
.with(TemporalAdjusters.lastDayOfMonth()); // ์œค๋…„ ๊ณ ๋ ค
90+
91+
List<SinceCommitResponseDto> sinceCommits = sinceCommitService.getSinceCommits(owner, repo, since, until);
92+
93+
return ResponseEntity.ok(sinceCommits);
94+
}
95+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package cmf.commitField.domain.commit.sinceCommit.dto;
2+
3+
import lombok.Getter;
4+
import lombok.NoArgsConstructor;
5+
6+
@Getter
7+
@NoArgsConstructor
8+
public class SinceCommitResponseDto {
9+
private String sha;
10+
private Commit commit;
11+
private Author author;
12+
private String html_url;
13+
14+
15+
@Getter
16+
@NoArgsConstructor
17+
public static class Commit {
18+
private CommitAuthor author; // ์›๋ž˜ ์ฝ”๋“œ ์ž‘์„ฑ์ž
19+
private String message;
20+
21+
@Getter
22+
@NoArgsConstructor
23+
public static class CommitAuthor {
24+
private String name; // ์ปค๋ฐ‹ํ•œ ์‚ฌ๋žŒ์˜ ๊นƒํ—ˆ๋ธŒ ์ด๋ฆ„
25+
private String email;
26+
private String date;
27+
}
28+
}
29+
30+
@Getter
31+
@NoArgsConstructor
32+
public static class Author {
33+
private String login; // ์ปค๋ฐ‹ํ•œ ์‚ฌ๋žŒ์˜ ๊นƒํ—ˆ๋ธŒ id
34+
private String avatar_url;
35+
private String html_url; // ์‚ฌ์šฉ์ž์˜ ๊นƒํ—ˆ๋ธŒ ์ฃผ์†Œ
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package cmf.commitField.domain.commit.sinceCommit.service;
2+
3+
import cmf.commitField.domain.commit.sinceCommit.dto.SinceCommitResponseDto;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.springframework.beans.factory.annotation.Value;
6+
import org.springframework.core.ParameterizedTypeReference;
7+
import org.springframework.http.HttpHeaders;
8+
import org.springframework.http.MediaType;
9+
import org.springframework.stereotype.Service;
10+
import org.springframework.web.reactive.function.client.WebClient;
11+
12+
import java.time.LocalDateTime;
13+
import java.time.format.DateTimeFormatter;
14+
import java.util.List;
15+
16+
@Slf4j
17+
@Service
18+
public class SinceCommitService {
19+
private static final String BASE_URL = "https://api.github.com";
20+
// ?since=2024-01-01T00:00:00Z&until=2025-02-1T23:59:59Z
21+
22+
@Value("${github.token}")
23+
private String PAT;
24+
25+
private final WebClient webClient = WebClient.builder()
26+
.baseUrl(BASE_URL)
27+
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
28+
.build();
29+
30+
public List<SinceCommitResponseDto> getSinceCommits(String owner, String repo, LocalDateTime since, LocalDateTime until) {
31+
try {
32+
return webClient.get()
33+
.uri(uriBuilder -> uriBuilder
34+
.path("/repos/{owner}/{repo}/commits")
35+
.queryParam("since", since.format(DateTimeFormatter.ISO_DATE_TIME))
36+
.queryParam("until", until.format(DateTimeFormatter.ISO_DATE_TIME))
37+
.build(owner, repo))
38+
.header("Authorization", "bearer " + PAT)
39+
.retrieve()
40+
.bodyToMono(new ParameterizedTypeReference<List<SinceCommitResponseDto>>() {})
41+
.block();
42+
} catch (Exception e) {
43+
log.error("GitHub API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {}", e.getMessage());
44+
throw new RuntimeException("GitHub API ํ˜ธ์ถœ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.", e);
45+
}
46+
}
47+
}
48+
/*
49+
ParameterizedTypeReference๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ์ด์œ 
50+
1. ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •๋ณด ๋ณด์กด
51+
2. ๋ณต์žกํ•œ ํƒ€์ž… ๊ตฌ์กฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
52+
3. ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ณด์žฅ
53+
4. ๋Ÿฐํƒ€์ž„์— ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…์œผ๋กœ ์—ญ์ง๋ ฌํ™” ๊ฐ€๋Šฅ
54+
55+
ParameterizedTypeReference๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด
56+
// ์ž˜๋ชป๋œ ์˜ˆ์‹œ
57+
List<GitHubCommitResponse> commits = webClient.get()
58+
.retrieve()
59+
.bodyToMono(List.class)
60+
.block();
61+
62+
// ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
63+
GitHubCommitResponse commit = commits.get(0); // ClassCastException ๋ฐœ์ƒ ์œ„ํ—˜
64+
*/

โ€Žsrc/main/java/cmf/commitField/domain/totalCommit/config/WebConfig.java renamed to โ€Žsrc/main/java/cmf/commitField/domain/commit/totalCommit/config/WebConfig.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cmf.commitField.domain.totalCommit.config;
1+
package cmf.commitField.domain.commit.totalCommit.config;
22

33
import org.springframework.web.servlet.config.annotation.CorsRegistry;
44
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

โ€Žsrc/main/java/cmf/commitField/domain/totalCommit/controller/TotalCommitController.java renamed to โ€Žsrc/main/java/cmf/commitField/domain/commit/totalCommit/controller/TotalCommitController.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package cmf.commitField.domain.totalCommit.controller;
1+
package cmf.commitField.domain.commit.totalCommit.controller;
22

3-
import cmf.commitField.domain.totalCommit.dto.TotalCommitResponseDto;
4-
import cmf.commitField.domain.totalCommit.service.TotalCommitService;
3+
import cmf.commitField.domain.commit.totalCommit.dto.TotalCommitResponseDto;
4+
import cmf.commitField.domain.commit.totalCommit.service.TotalCommitService;
55
import lombok.RequiredArgsConstructor;
66
import org.springframework.web.bind.annotation.GetMapping;
77
import org.springframework.web.bind.annotation.PathVariable;

โ€Žsrc/main/java/cmf/commitField/domain/totalCommit/dto/TotalCommitGraphQLResponse.java renamed to โ€Žsrc/main/java/cmf/commitField/domain/commit/totalCommit/dto/TotalCommitGraphQLResponse.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cmf.commitField.domain.totalCommit.dto;
1+
package cmf.commitField.domain.commit.totalCommit.dto;
22

33
import lombok.Getter;
44
import lombok.NoArgsConstructor;

โ€Žsrc/main/java/cmf/commitField/domain/totalCommit/dto/TotalCommitResponseDto.java renamed to โ€Žsrc/main/java/cmf/commitField/domain/commit/totalCommit/dto/TotalCommitResponseDto.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package cmf.commitField.domain.totalCommit.dto;
1+
package cmf.commitField.domain.commit.totalCommit.dto;
22

33
import lombok.AllArgsConstructor;
44
import lombok.Getter;

โ€Žsrc/main/java/cmf/commitField/domain/totalCommit/service/TotalCommitService.java renamed to โ€Žsrc/main/java/cmf/commitField/domain/commit/totalCommit/service/TotalCommitService.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package cmf.commitField.domain.totalCommit.service;
1+
package cmf.commitField.domain.commit.totalCommit.service;
22

3-
import cmf.commitField.domain.totalCommit.dto.TotalCommitGraphQLResponse;
4-
import cmf.commitField.domain.totalCommit.dto.TotalCommitResponseDto;
3+
import cmf.commitField.domain.commit.totalCommit.dto.TotalCommitGraphQLResponse;
4+
import cmf.commitField.domain.commit.totalCommit.dto.TotalCommitResponseDto;
55
import lombok.RequiredArgsConstructor;
66
import org.springframework.beans.factory.annotation.Value;
77
import org.springframework.http.HttpHeaders;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cmf.commitField.domain.season.controller;
2+
3+
import cmf.commitField.domain.season.entity.Season;
4+
import cmf.commitField.domain.season.service.SeasonService;
5+
import cmf.commitField.global.scheduler.SeasonScheduler;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.web.bind.annotation.*;
8+
9+
import javax.swing.*;
10+
import java.time.LocalDateTime;
11+
12+
@RestController
13+
@RequestMapping("/api/seasons")
14+
@RequiredArgsConstructor
15+
public class ApiV1SeasonController {
16+
private final SeasonService seasonService;
17+
private final SeasonScheduler seasonScheduler;
18+
19+
// ์˜ˆ์‹œ๋กœ Season ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ํ•ด๋ณด๊ธฐ
20+
@PostMapping
21+
public Season createSeason() {
22+
String name = "2025 1๋ถ„๊ธฐ";
23+
LocalDateTime start = LocalDateTime.of(2025, 1, 1, 0, 0, 0);
24+
LocalDateTime end = LocalDateTime.of(2025, 2, 28, 23, 59, 59);
25+
26+
return seasonService.createNewSeason(name, start, end);
27+
}
28+
29+
@GetMapping("/active")
30+
public Season getActiveSeason() {
31+
return seasonService.getActiveSeason();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package cmf.commitField.domain.season.controller;
2+
3+
import cmf.commitField.domain.season.dto.UserSeasonDto;
4+
import cmf.commitField.domain.season.entity.UserSeason;
5+
import cmf.commitField.domain.season.service.UserSeasonService;
6+
import cmf.commitField.global.globalDto.GlobalResponse;
7+
import cmf.commitField.global.globalDto.GlobalResponseCode;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import java.util.List;
16+
import java.util.stream.Collectors;
17+
18+
@RestController
19+
@RequestMapping("/user-season")
20+
@RequiredArgsConstructor
21+
public class ApiV1UserSeasonController {
22+
private final UserSeasonService userSeasonService;
23+
24+
// ํ˜„์žฌ ์‹œ์ฆŒ์— ์œ ์ € ๋žญํฌ ์ถ”๊ฐ€ํ•˜๊ธฐ (SEED ๋“ฑ๊ธ‰)
25+
@GetMapping("/{userId}")
26+
public GlobalResponse<UserSeasonDto> addUserRank(@PathVariable Long userId) {
27+
UserSeason userSeason = userSeasonService.addUserRank(userId);
28+
UserSeasonDto userSeasonDto = new UserSeasonDto(userSeason);
29+
return GlobalResponse.success(userSeasonDto);
30+
}
31+
32+
// ์œ ์ €์˜ ๋ชจ๋“  ์‹œ์ฆŒ ๋žญํฌ ์กฐํšŒ
33+
@GetMapping("/{userId}/ranks")
34+
public GlobalResponse<List<UserSeasonDto>> getUserRanks(@PathVariable Long userId) {
35+
List<UserSeason> userSeasons = userSeasonService.getUserRanks(userId);
36+
37+
// UserSeason -> UserSeasonDto ๋ณ€ํ™˜
38+
List<UserSeasonDto> userSeasonDtos = userSeasons.stream()
39+
.map(UserSeasonDto::new)
40+
.collect(Collectors.toList());
41+
42+
return GlobalResponse.success(userSeasonDtos);
43+
}
44+
45+
// ํŠน์ • ์‹œ์ฆŒ์˜ ์œ ์ € ๋žญํฌ ์กฐํšŒ
46+
@GetMapping("/{userId}/season/{seasonId}")
47+
public GlobalResponse<UserSeasonDto> getUserRankBySeason(
48+
@PathVariable Long userId,
49+
@PathVariable Long seasonId
50+
) {
51+
UserSeason userSeason = userSeasonService.getUserRankBySeason(userId, seasonId);
52+
UserSeasonDto userSeasonDto = new UserSeasonDto(userSeason);
53+
return GlobalResponse.success(userSeasonDto);
54+
}
55+
}
56+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package cmf.commitField.domain.season.dto;
2+
3+
import cmf.commitField.domain.season.entity.Rank;
4+
import cmf.commitField.domain.season.entity.UserSeason;
5+
import lombok.Getter;
6+
7+
@Getter
8+
public class UserSeasonDto {
9+
private Long userId;
10+
private String username;
11+
private String seasonName;
12+
private Rank rank;
13+
14+
public UserSeasonDto(UserSeason userSeason) {
15+
this.userId = userSeason.getUser().getId();
16+
this.username = userSeason.getUser().getUsername();
17+
this.seasonName = userSeason.getSeason().getName();
18+
this.rank = userSeason.getRank();
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package cmf.commitField.domain.season.entity;
2+
3+
public enum Rank {
4+
SEED, // ์”จ์•—
5+
SPROUT, // ์ƒˆ์‹น
6+
STEM, // ์ค„๊ธฐ
7+
FLOWER, // ๊ฝƒ
8+
FRUIT, // ์—ด๋งค
9+
TREE // ๋‚˜๋ฌด
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package cmf.commitField.domain.season.entity;
2+
3+
import cmf.commitField.global.jpa.BaseEntity;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.EnumType;
6+
import jakarta.persistence.Enumerated;
7+
import jakarta.persistence.Table;
8+
import lombok.*;
9+
import lombok.experimental.SuperBuilder;
10+
11+
import java.time.LocalDateTime;
12+
13+
@Entity
14+
@Getter
15+
@Setter
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
@SuperBuilder
19+
@Table(name = "season")
20+
public class Season extends BaseEntity {
21+
private String name;
22+
23+
private LocalDateTime startDate;
24+
private LocalDateTime endDate;
25+
26+
@Enumerated(EnumType.STRING)
27+
private SeasonStatus status; // ACTIVE, INACTIVE
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package cmf.commitField.domain.season.entity;
2+
3+
public enum SeasonStatus {
4+
ACTIVE, INACTIVE
5+
}

0 commit comments

Comments
ย (0)