Skip to content

Commit 4a31111

Browse files
committed
API v2
1 parent 92f458e commit 4a31111

File tree

5 files changed

+74
-32
lines changed

5 files changed

+74
-32
lines changed

src/main/java/com/openelements/issues/ApiEndpoint.java

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.openelements.issues.data.Contributor;
44
import com.openelements.issues.data.Issue;
55
import com.openelements.issues.services.GitHubCache;
6+
import java.util.List;
67
import java.util.Objects;
78
import java.util.Set;
89
import java.util.stream.Collectors;
@@ -25,46 +26,88 @@ public ApiEndpoint(@NonNull final GitHubCache issueCache) {
2526
this.issueCache = Objects.requireNonNull(issueCache, "issueCache must not be null");
2627
}
2728

29+
@Deprecated(forRemoval = true)
30+
private record OldIssueResponse(@NonNull String title, @NonNull String link, @NonNull String org, @NonNull String repo, @NonNull String imageUrl, @NonNull String identifier, boolean isAssigned, boolean isClosed, @NonNull List<String> labels, @NonNull List<String> languageTags) {
31+
}
32+
33+
/**
34+
* @deprecated Use {@link #getIssues(Boolean, Boolean, Set, Set, Set)} instead
35+
* @return Set of good first issues
36+
*/
37+
@Deprecated(forRemoval = true)
38+
@GetMapping("/api/hacktoberfest-issues")
39+
public Set<OldIssueResponse> getHacktoberfestIssuesOld() {
40+
log.warn("DEPRECATED API CALLED: Getting Hacktoberfest issues");
41+
return issueCache.getIssues(LabelConstants.HACKTOBERFEST_LABEL).stream()
42+
.map(issue -> new OldIssueResponse(issue.title(), issue.link(), issue.repository().org(), issue.repository().name(), issue.repository().imageUrl(), issue.identifier(), issue.isAssigned(), issue.isClosed(), issue.labels(), issue.repository().languages()))
43+
.collect(Collectors.toUnmodifiableSet());
44+
}
45+
46+
/**
47+
* @deprecated Use {@link #getContributors()} instead
48+
* @return
49+
*/
50+
@Deprecated(forRemoval = true)
51+
@GetMapping("/api/contributors")
52+
public Set<Contributor> getContributorsOld() {
53+
log.warn("DEPRECATED API CALLED: Getting Contributors");
54+
return getContributors();
55+
}
56+
57+
/**
58+
* @deprecated Use {@link #getIssues(Boolean, Boolean, Set, Set, Set)} instead
59+
* @return Set of good first issues
60+
*/
61+
@Deprecated(forRemoval = true)
2862
@GetMapping("/api/good-first-issues")
29-
public Set<Issue> getGoodFirstIssues() {
63+
public Set<OldIssueResponse> getGoodFirstIssuesOld() {
3064
log.info("Getting good first issues");
31-
return issueCache.getIssues(LabelConstants.GOOD_FIRST_ISSUE_LABEL);
65+
return issueCache.getIssues(LabelConstants.GOOD_FIRST_ISSUE_LABEL).stream()
66+
.map(issue -> new OldIssueResponse(issue.title(), issue.link(), issue.repository().org(), issue.repository().name(), issue.repository().imageUrl(), issue.identifier(), issue.isAssigned(), issue.isClosed(), issue.labels(), issue.repository().languages()))
67+
.collect(Collectors.toUnmodifiableSet());
3268
}
3369

70+
/**
71+
* @deprecated Use {@link #getIssues(Boolean, Boolean, Set, Set, Set)} instead
72+
* @return Set of good first issues
73+
*/
74+
@Deprecated(forRemoval = true)
3475
@GetMapping("/api/good-first-issue-candidates")
35-
public Set<Issue> getGoodFirstIssuesCandidates() {
76+
public Set<OldIssueResponse> getGoodFirstIssuesCandidatesOld() {
3677
log.info("Getting good first issue candidates");
37-
return issueCache.getIssues(LabelConstants.GOOD_FIRST_ISSUE_CANDIDATE_LABEL);
38-
}
39-
40-
@GetMapping("/api/hacktoberfest-issues")
41-
public Set<Issue> getHacktoberfestIssues() {
42-
log.info("Getting Hacktoberfest issues");
43-
return issueCache.getIssues(LabelConstants.HACKTOBERFEST_LABEL);
78+
return issueCache.getIssues(LabelConstants.GOOD_FIRST_ISSUE_CANDIDATE_LABEL).stream()
79+
.map(issue -> new OldIssueResponse(issue.title(), issue.link(), issue.repository().org(), issue.repository().name(), issue.repository().imageUrl(), issue.identifier(), issue.isAssigned(), issue.isClosed(), issue.labels(), issue.repository().languages()))
80+
.collect(Collectors.toUnmodifiableSet());
4481
}
4582

83+
/**
84+
* @deprecated Use {@link #getIssues(Boolean, Boolean, Set, Set, Set)} instead
85+
* @return Set of good first issues
86+
*/
87+
@Deprecated(forRemoval = true)
4688
@GetMapping("/api/help-wanted-issues")
47-
public Set<Issue> getHelpWantedIssues() {
89+
public Set<OldIssueResponse> getHelpWantedIssuesOld() {
4890
log.info("Getting help wanted issues");
49-
return issueCache.getIssues(LabelConstants.HELP_WANTED_LABEL);
91+
return issueCache.getIssues(LabelConstants.HELP_WANTED_LABEL).stream()
92+
.map(issue -> new OldIssueResponse(issue.title(), issue.link(), issue.repository().org(), issue.repository().name(), issue.repository().imageUrl(), issue.identifier(), issue.isAssigned(), issue.isClosed(), issue.labels(), issue.repository().languages()))
93+
.collect(Collectors.toUnmodifiableSet());
5094
}
5195

52-
@GetMapping("/api/contributors")
96+
@GetMapping("/api/v2/contributors")
5397
public Set<Contributor> getContributors() {
5498
log.info("Getting contributors");
5599
return issueCache.getContributors();
56100
}
57101

58-
@GetMapping("/api/issues")
59-
public Set<Issue> getGoodFirstIssues(@PathVariable(required = false) Boolean isAssigned, @PathVariable(required = false) Boolean isClosed, @PathVariable(required = false) Set<String> filteredLabels, @PathVariable(required = false) Set<String> excludedLabels, @PathVariable(required = false) Set<String> filteredLanguages) {
102+
@GetMapping("/api/v2/issues")
103+
public Set<Issue> getIssues(@PathVariable(required = false) Boolean isAssigned, @PathVariable(required = false) Boolean isClosed, @PathVariable(required = false) Set<String> filteredLabels, @PathVariable(required = false) Set<String> excludedLabels, @PathVariable(required = false) Set<String> filteredLanguages) {
60104
log.info("Getting good first issues");
61105
return issueCache.getAllIssues().stream()
62106
.filter(issue -> isAssigned == null || issue.isAssigned() == isAssigned)
63107
.filter(issue -> isClosed == null || issue.isClosed() == isClosed)
64108
.filter(issue -> filteredLabels == null || issue.labels().containsAll(filteredLabels))
65109
.filter(issue -> excludedLabels == null || issue.labels().stream().noneMatch(excludedLabels::contains))
66-
.filter(issue -> filteredLanguages == null || issue.languageTags().containsAll(filteredLanguages))
110+
.filter(issue -> filteredLanguages == null || issue.repository().languages().containsAll(filteredLanguages))
67111
.collect(Collectors.toUnmodifiableSet());
68112
}
69-
70113
}

src/main/java/com/openelements/issues/data/Issue.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,26 @@
44
import java.util.Objects;
55
import org.jspecify.annotations.NonNull;
66

7-
public record Issue(@NonNull String title, @NonNull String link, @NonNull String org, @NonNull String repo, @NonNull String imageUrl, @NonNull String identifier, boolean isAssigned, boolean isClosed, @NonNull List<String> labels, @NonNull List<String> languageTags) {
7+
public record Issue(@NonNull String title, @NonNull String identifier, @NonNull Repository repository, @NonNull String link,
8+
boolean isAssigned, boolean isClosed, @NonNull List<String> labels) {
89

9-
public Issue(@NonNull String title, @NonNull String link, @NonNull String org, @NonNull String repo, @NonNull String imageUrl, @NonNull String identifier, boolean isAssigned, boolean isClosed, @NonNull List<String> labels, @NonNull List<String> languageTags) {
10+
public Issue(@NonNull String title, @NonNull String identifier, @NonNull Repository repository, @NonNull String link,
11+
boolean isAssigned, boolean isClosed, @NonNull List<String> labels) {
1012
this.title = Objects.requireNonNull(title, "title must not be null");
1113
this.link = Objects.requireNonNull(link, "link must not be null");
12-
this.org = Objects.requireNonNull(org, "org must not be null");
13-
this.repo = Objects.requireNonNull(repo, "repo must not be null");
14-
this.imageUrl = Objects.requireNonNull(imageUrl, "imageUrl must not be null");
14+
this.repository = Objects.requireNonNull(repository, "org must not be null");
1515
this.identifier = Objects.requireNonNull(identifier, "identifier must not be null");
1616
this.isAssigned = isAssigned;
1717
this.isClosed = isClosed;
1818
Objects.requireNonNull(labels, "labels must not be null");
1919
this.labels = List.copyOf(labels);
20-
Objects.requireNonNull(languageTags, "languageTags must not be null");
21-
this.languageTags = List.copyOf(languageTags);
2220

2321
if (title.isBlank()) {
2422
throw new IllegalArgumentException("title is required");
2523
}
2624
if (link.isBlank()) {
2725
throw new IllegalArgumentException("link is required");
2826
}
29-
if (org.isBlank()) {
30-
throw new IllegalArgumentException("org is required");
31-
}
32-
if (repo.isBlank()) {
33-
throw new IllegalArgumentException("repo is required");
34-
}
3527
if (identifier.isBlank()) {
3628
throw new IllegalArgumentException("identifier is required");
3729
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.openelements.issues.data;
2+
3+
import java.util.List;
4+
import org.jspecify.annotations.NonNull;
5+
6+
public record PullRequest(@NonNull String title, @NonNull String identifier, @NonNull Repository repository, @NonNull String link,
7+
boolean isMerged, @NonNull List<String> labels) {
8+
}

src/main/java/com/openelements/issues/data/Repository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ public Repository(@NonNull String org, @NonNull String name, @NonNull String ima
1414
this.imageUrl = Objects.requireNonNull(imageUrl, "imageUrl must not be null");
1515
Objects.requireNonNull(languages, "languages must not be null");
1616
this.languages = List.copyOf(languages);
17-
1817
if (org.isBlank()) {
1918
throw new IllegalArgumentException("org is required");
2019
}

src/main/java/com/openelements/issues/services/GitHubClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public List<Issue> getIssues(@NonNull final Repository repository, @NonNull fina
160160
}
161161

162162

163-
final Issue issue = new Issue(title, url, repository.org(), repository.name(), repository.imageUrl(), Integer.valueOf(number).toString(), isAssigned, isClosed, labels, repository.languages());
163+
final Issue issue = new Issue(title, Integer.valueOf(number).toString(), repository, url, isAssigned, isClosed, labels);
164164
issues.add(issue);
165165
});
166166
return Collections.unmodifiableList(issues);

0 commit comments

Comments
 (0)