Skip to content

Commit 0c654f9

Browse files
Add build metadata (closes #3) (#10)
* add basic metadata this is untested * clean code * fix metadata value
1 parent f27d176 commit 0c654f9

15 files changed

+175
-49
lines changed

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
# Papyrus
22

3+
## Info
4+
35
Downloads API for [Purpur](https://purpurmc.org/) builds.
46

57
API: https://api.purpurmc.org
68

79
OpenAPI Spec: https://api.purpurmc.org/openapi
810

911
SwaggerDocs: https://api.purpurmc.org/docs/
12+
13+
## Dev Environment
14+
todo

build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55
}
66

77
group = "org.purpurmc"
8-
version = "2.0.0"
8+
version = "2.1.0"
99

1010
java {
1111
sourceCompatibility = JavaVersion.VERSION_21

src/main/java/org/purpurmc/papyrus/config/OpenAPIConfiguration.java

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import io.swagger.v3.oas.models.OpenAPI;
44
import io.swagger.v3.oas.models.info.Info;
55
import io.swagger.v3.oas.models.servers.Server;
6-
import org.springframework.beans.factory.annotation.Autowired;
76
import org.springframework.context.annotation.Bean;
87
import org.springframework.context.annotation.Configuration;
98

src/main/java/org/purpurmc/papyrus/controller/v2/BuildController.java

+26-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package org.purpurmc.papyrus.controller.v2;
22

33
import io.swagger.v3.oas.annotations.Operation;
4-
import org.apache.commons.lang3.RandomStringUtils;
54
import org.purpurmc.papyrus.config.AppConfiguration;
65
import org.purpurmc.papyrus.db.entity.Build;
76
import org.purpurmc.papyrus.db.entity.Commit;
87
import org.purpurmc.papyrus.db.entity.File;
8+
import org.purpurmc.papyrus.db.entity.Metadata;
99
import org.purpurmc.papyrus.db.entity.Project;
1010
import org.purpurmc.papyrus.db.entity.Version;
1111
import org.purpurmc.papyrus.db.repository.BuildRepository;
1212
import org.purpurmc.papyrus.db.repository.CommitRepository;
1313
import org.purpurmc.papyrus.db.repository.FileRepository;
14+
import org.purpurmc.papyrus.db.repository.MetadataRepository;
1415
import org.purpurmc.papyrus.db.repository.ProjectRepository;
1516
import org.purpurmc.papyrus.db.repository.VersionRepository;
1617
import org.purpurmc.papyrus.exception.BuildNotFound;
@@ -33,8 +34,9 @@
3334
import java.io.IOException;
3435
import java.nio.file.Files;
3536
import java.nio.file.Path;
37+
import java.util.HashMap;
3638
import java.util.List;
37-
import java.util.Random;
39+
import java.util.Map;
3840

3941
@RestController
4042
@RequestMapping("/v2/{project}/{version}")
@@ -44,15 +46,17 @@ public class BuildController {
4446
private final VersionRepository versionRepository;
4547
private final BuildRepository buildRepository;
4648
private final CommitRepository commitRepository;
49+
private final MetadataRepository metadataRepository;
4750
private final FileRepository fileRepository;
4851

4952
@Autowired
50-
public BuildController(AppConfiguration configuration, ProjectRepository projectRepository, VersionRepository versionRepository, BuildRepository buildRepository, CommitRepository commitRepository, FileRepository fileRepository) {
53+
public BuildController(AppConfiguration configuration, ProjectRepository projectRepository, VersionRepository versionRepository, BuildRepository buildRepository, CommitRepository commitRepository, MetadataRepository metadataRepository, FileRepository fileRepository) {
5154
this.configuration = configuration;
5255
this.projectRepository = projectRepository;
5356
this.versionRepository = versionRepository;
5457
this.buildRepository = buildRepository;
5558
this.commitRepository = commitRepository;
59+
this.metadataRepository = metadataRepository;
5660
this.fileRepository = fileRepository;
5761
}
5862

@@ -69,13 +73,14 @@ public BuildResponse getBuild(@PathVariable("project") String projectName, @Path
6973
List<Commit> commits = commitRepository.findAllByBuild(build);
7074

7175
List<BuildResponse.BuildCommits> responseCommits = commits.stream().map(commit -> new BuildResponse.BuildCommits(commit.getAuthor(), commit.getEmail(), commit.getDescription(), commit.getHash(), commit.getTimestamp())).toList();
72-
return new BuildResponse(project.getName(), version.getName(), build.getName(), build.getResult().toString(), build.getTimestamp(), build.getDuration(), responseCommits, build.getHash());
73-
}
76+
List<Metadata> metadata = metadataRepository.findByBuild(build);
77+
Map<String, String> responseMetadata = new HashMap<>();
7478

75-
public record BuildResponse(String project, String version, String build, String result, long timestamp, long duration,
76-
List<BuildCommits> commits, String md5) {
77-
public record BuildCommits(String author, String email, String description, String hash, long timestamp) {
79+
for (Metadata data : metadata) {
80+
responseMetadata.put(data.getName(), data.getValue());
7881
}
82+
83+
return new BuildResponse(project.getName(), version.getName(), build.getName(), build.getResult().toString(), build.getTimestamp(), build.getDuration(), responseCommits, responseMetadata, build.getHash());
7984
}
8085

8186
@GetMapping("/{build}/download")
@@ -115,4 +120,17 @@ public ResponseEntity<Resource> downloadBuild(@PathVariable("project") String pr
115120
.header(HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.attachment().filename(filename).build().toString())
116121
.body(resource);
117122
}
123+
124+
public record BuildResponse(String project,
125+
String version,
126+
String build,
127+
String result,
128+
long timestamp,
129+
long duration,
130+
List<BuildCommits> commits,
131+
Map<String, String> metadata,
132+
String md5) {
133+
public record BuildCommits(String author, String email, String description, String hash, long timestamp) {
134+
}
135+
}
118136
}

src/main/java/org/purpurmc/papyrus/controller/v2/CreationController.java

+29-10
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@
66
import org.purpurmc.papyrus.db.entity.Commit;
77
import org.purpurmc.papyrus.db.entity.CreationState;
88
import org.purpurmc.papyrus.db.entity.File;
9+
import org.purpurmc.papyrus.db.entity.Metadata;
910
import org.purpurmc.papyrus.db.entity.Project;
1011
import org.purpurmc.papyrus.db.entity.Version;
1112
import org.purpurmc.papyrus.db.repository.BuildRepository;
1213
import org.purpurmc.papyrus.db.repository.CommitRepository;
1314
import org.purpurmc.papyrus.db.repository.CreationStateRepository;
1415
import org.purpurmc.papyrus.db.repository.FileRepository;
16+
import org.purpurmc.papyrus.db.repository.MetadataRepository;
1517
import org.purpurmc.papyrus.db.repository.ProjectRepository;
1618
import org.purpurmc.papyrus.db.repository.VersionRepository;
1719
import org.purpurmc.papyrus.exception.BuildAlreadyExists;
@@ -33,7 +35,9 @@
3335

3436
import java.nio.file.Files;
3537
import java.nio.file.Path;
38+
import java.util.ArrayList;
3639
import java.util.List;
40+
import java.util.Map;
3741
import java.util.Optional;
3842
import java.util.UUID;
3943

@@ -46,6 +50,7 @@ public class CreationController {
4650
private final VersionRepository versionRepository;
4751
private final BuildRepository buildRepository;
4852
private final CommitRepository commitRepository;
53+
private final MetadataRepository metadataRepository;
4954
private final FileRepository fileRepository;
5055
private final CreationStateRepository creationStateRepository;
5156

@@ -56,6 +61,7 @@ public CreationController(
5661
VersionRepository versionRepository,
5762
BuildRepository buildRepository,
5863
CommitRepository commitRepository,
64+
MetadataRepository metadataRepository,
5965
FileRepository fileRepository,
6066
CreationStateRepository creationStateRepository
6167
) {
@@ -64,6 +70,7 @@ public CreationController(
6470
this.versionRepository = versionRepository;
6571
this.buildRepository = buildRepository;
6672
this.commitRepository = commitRepository;
73+
this.metadataRepository = metadataRepository;
6774
this.fileRepository = fileRepository;
6875
this.creationStateRepository = creationStateRepository;
6976
}
@@ -106,6 +113,12 @@ public CreateBuild createBuild(@RequestHeader(HttpHeaders.AUTHORIZATION) String
106113
commitRepository.saveAll(body.commits.stream().map(commit -> new Commit(build, commit.author, commit.email, commit.description, commit.hash, commit.timestamp)).toList());
107114
}
108115

116+
if (body.metadata != null) {
117+
List<Metadata> metadata = new ArrayList<>();
118+
body.metadata.forEach((name, value) -> metadata.add(new Metadata(build, name, value)));
119+
metadataRepository.saveAll(metadata);
120+
}
121+
109122
if (ready == 1) {
110123
return new CreateBuild(null);
111124
}
@@ -114,16 +127,6 @@ public CreateBuild createBuild(@RequestHeader(HttpHeaders.AUTHORIZATION) String
114127
return new CreateBuild(id.getId().toString());
115128
}
116129

117-
private record CreateBuildBody(String project, String version, String build, Build.BuildResult result,
118-
long timestamp, long duration, List<CommitBody> commits,
119-
String fileExtension) {
120-
public record CommitBody(String author, String email, String description, String hash, long timestamp) {
121-
}
122-
}
123-
124-
private record CreateBuild(String stateKey) {
125-
}
126-
127130
@PostMapping("/upload")
128131
@ResponseBody
129132
public ResponseEntity<String> uploadFile(@RequestHeader(HttpHeaders.AUTHORIZATION) String authHeader, @RequestParam("stateKey") String stateKey, @RequestParam("file") MultipartFile uploadFile) {
@@ -185,4 +188,20 @@ private void requireAuth(String authHeader) {
185188
throw new InvalidAuthToken();
186189
}
187190
}
191+
192+
private record CreateBuildBody(String project,
193+
String version,
194+
String build,
195+
Build.BuildResult result,
196+
long timestamp,
197+
long duration,
198+
List<CommitBody> commits,
199+
Map<String, String> metadata,
200+
String fileExtension) {
201+
public record CommitBody(String author, String email, String description, String hash, long timestamp) {
202+
}
203+
}
204+
205+
private record CreateBuild(String stateKey) {
206+
}
188207
}

src/main/java/org/purpurmc/papyrus/controller/v2/ProjectController.java

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
package org.purpurmc.papyrus.controller.v2;
22

33
import io.swagger.v3.oas.annotations.Operation;
4-
import io.swagger.v3.oas.annotations.responses.ApiResponse;
5-
import io.swagger.v3.oas.annotations.responses.ApiResponses;
6-
import org.apache.commons.lang3.RandomStringUtils;
74
import org.purpurmc.papyrus.db.entity.Project;
85
import org.purpurmc.papyrus.db.entity.Version;
96
import org.purpurmc.papyrus.db.repository.ProjectRepository;
107
import org.purpurmc.papyrus.db.repository.VersionRepository;
118
import org.purpurmc.papyrus.exception.ProjectNotFound;
129
import org.springframework.beans.factory.annotation.Autowired;
13-
import org.springframework.http.HttpStatus;
1410
import org.springframework.web.bind.annotation.GetMapping;
1511
import org.springframework.web.bind.annotation.PathVariable;
1612
import org.springframework.web.bind.annotation.RequestMapping;
1713
import org.springframework.web.bind.annotation.ResponseBody;
18-
import org.springframework.web.bind.annotation.ResponseStatus;
1914
import org.springframework.web.bind.annotation.RestController;
2015

2116
import java.util.List;
@@ -40,9 +35,6 @@ public ProjectsResponse listProjects() {
4035
return new ProjectsResponse(projects.stream().map(Project::getName).toList());
4136
}
4237

43-
private record ProjectsResponse(List<String> projects) {
44-
}
45-
4638
@GetMapping("/{project}")
4739
@ResponseBody
4840
@Operation(summary = "Get a project")
@@ -53,6 +45,9 @@ public ProjectResponse getProject(@PathVariable("project") String projectName) {
5345
return new ProjectResponse(project.getName(), versions.stream().map(Version::getName).toList());
5446
}
5547

48+
private record ProjectsResponse(List<String> projects) {
49+
}
50+
5651
private record ProjectResponse(String project, List<String> versions) {
5752
}
5853
}

src/main/java/org/purpurmc/papyrus/controller/v2/VersionController.java

+23-14
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import io.swagger.v3.oas.annotations.Operation;
44
import org.purpurmc.papyrus.db.entity.Build;
55
import org.purpurmc.papyrus.db.entity.Commit;
6+
import org.purpurmc.papyrus.db.entity.Metadata;
67
import org.purpurmc.papyrus.db.entity.Project;
78
import org.purpurmc.papyrus.db.entity.Version;
89
import org.purpurmc.papyrus.db.repository.BuildRepository;
910
import org.purpurmc.papyrus.db.repository.CommitRepository;
11+
import org.purpurmc.papyrus.db.repository.MetadataRepository;
1012
import org.purpurmc.papyrus.db.repository.ProjectRepository;
1113
import org.purpurmc.papyrus.db.repository.VersionRepository;
1214
import org.purpurmc.papyrus.exception.ProjectNotFound;
@@ -20,8 +22,9 @@
2022
import org.springframework.web.bind.annotation.ResponseBody;
2123
import org.springframework.web.bind.annotation.RestController;
2224

23-
import java.util.ArrayList;
25+
import java.util.HashMap;
2426
import java.util.List;
27+
import java.util.Map;
2528
import java.util.Optional;
2629

2730
@RestController
@@ -31,13 +34,15 @@ public class VersionController {
3134
private final VersionRepository versionRepository;
3235
private final BuildRepository buildRepository;
3336
private final CommitRepository commitRepository;
37+
private final MetadataRepository metadataRepository;
3438

3539
@Autowired
36-
public VersionController(ProjectRepository projectRepository, VersionRepository versionRepository, BuildRepository buildRepository, CommitRepository commitRepository) {
40+
public VersionController(ProjectRepository projectRepository, VersionRepository versionRepository, BuildRepository buildRepository, CommitRepository commitRepository, MetadataRepository metadataRepository) {
3741
this.projectRepository = projectRepository;
3842
this.versionRepository = versionRepository;
3943
this.buildRepository = buildRepository;
4044
this.commitRepository = commitRepository;
45+
this.metadataRepository = metadataRepository;
4146
}
4247

4348
@GetMapping("/{version}")
@@ -74,24 +79,28 @@ public ResponseEntity<?> getVersion(@PathVariable("project") String projectName,
7479
}
7580
}
7681

77-
private record VersionResponse(String project, String version, VersionBuilds builds) {
78-
public record VersionBuilds(Optional<String> latest, List<String> all) {
82+
private BuildController.BuildResponse convertToBuildResponse(Project project, Version version, Build build) {
83+
List<Commit> commits = commitRepository.findAllByBuild(build);
84+
List<BuildController.BuildResponse.BuildCommits> responseCommits = commits.stream().map(commit -> new BuildController.BuildResponse.BuildCommits(commit.getAuthor(), commit.getEmail(), commit.getDescription(), commit.getHash(), commit.getTimestamp())).toList();
85+
86+
List<Metadata> metadata = metadataRepository.findByBuild(build);
87+
Map<String, String> responseMetadata = new HashMap<>();
88+
89+
for (Metadata data : metadata) {
90+
responseMetadata.put(data.getName(), data.getValue());
7991
}
92+
93+
return new BuildController.BuildResponse(project.getName(), version.getName(), build.getName(), build.getResult().toString(), build.getTimestamp(), build.getDuration(), responseCommits, responseMetadata, build.getHash());
8094
}
8195

82-
private record VersionResponseDetailed(String project, String version, VersionBuildsDetailed builds) {
83-
public record VersionBuildsDetailed(Optional<BuildController.BuildResponse> latest, List<BuildController.BuildResponse> all) {
96+
private record VersionResponse(String project, String version, VersionBuilds builds) {
97+
public record VersionBuilds(Optional<String> latest, List<String> all) {
8498
}
8599
}
86100

87-
private BuildController.BuildResponse convertToBuildResponse(Project project, Version version, Build build) {
88-
List<Commit> commits = commitRepository.findAllByBuild(build);
89-
List<BuildController.BuildResponse.BuildCommits> responseCommits = new ArrayList<>();
90-
91-
for (Commit commit : commits) {
92-
responseCommits.add(new BuildController.BuildResponse.BuildCommits(commit.getAuthor(), commit.getEmail(), commit.getDescription(), commit.getHash(), commit.getTimestamp()));
101+
private record VersionResponseDetailed(String project, String version, VersionBuildsDetailed builds) {
102+
public record VersionBuildsDetailed(Optional<BuildController.BuildResponse> latest,
103+
List<BuildController.BuildResponse> all) {
93104
}
94-
95-
return new BuildController.BuildResponse(project.getName(), version.getName(), build.getName(), build.getResult().toString(), build.getTimestamp(), build.getDuration(), responseCommits, build.getHash());
96105
}
97106
}

src/main/java/org/purpurmc/papyrus/db/entity/Build.java

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import jakarta.annotation.Nonnull;
44
import jakarta.annotation.Nullable;
5-
import jakarta.persistence.Column;
65
import jakarta.persistence.Entity;
76
import jakarta.persistence.EnumType;
87
import jakarta.persistence.Enumerated;

src/main/java/org/purpurmc/papyrus/db/entity/CreationState.java

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import jakarta.persistence.JoinColumn;
1010
import jakarta.persistence.OneToOne;
1111

12-
import java.util.Optional;
1312
import java.util.UUID;
1413

1514
@Entity

0 commit comments

Comments
 (0)