Skip to content

Commit 9f15c04

Browse files
authored
Merge pull request #11 from mcanoy/legacy
support for legacy engagement.json
2 parents 2ccdb36 + fbb0476 commit 9f15c04

File tree

7 files changed

+112
-44
lines changed

7 files changed

+112
-44
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.redhat.labs.lodestar.model.gitlab;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.nio.charset.StandardCharsets;
9+
import java.util.Base64;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class Action {
16+
17+
@Builder.Default
18+
private String action = "update";
19+
private String filePath;
20+
private String content;
21+
@Builder.Default
22+
private String encoding = "base64";
23+
24+
public static class ActionBuilder {
25+
26+
public ActionBuilder content(String content) {
27+
byte[] encodedContents = Base64.getEncoder().encode(content.getBytes());
28+
this.content = new String(encodedContents, StandardCharsets.UTF_8);
29+
return this;
30+
}
31+
}
32+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.redhat.labs.lodestar.model.gitlab;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
import java.util.List;
9+
10+
@Data
11+
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
public class Commit {
15+
16+
private String branch;
17+
private String commitMessage;
18+
private List<Action> actions;
19+
private String authorName;
20+
private String authorEmail;
21+
}

src/main/java/com/redhat/labs/lodestar/rest/client/GitlabRestClient.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
package com.redhat.labs.lodestar.rest.client;
22

3-
import javax.ws.rs.Encoded;
4-
import javax.ws.rs.GET;
5-
import javax.ws.rs.PUT;
6-
import javax.ws.rs.Path;
7-
import javax.ws.rs.PathParam;
8-
import javax.ws.rs.Produces;
9-
import javax.ws.rs.QueryParam;
10-
import javax.ws.rs.WebApplicationException;
3+
import javax.ws.rs.*;
114

5+
import com.redhat.labs.lodestar.model.gitlab.Commit;
126
import org.apache.http.NoHttpResponseException;
137
import org.eclipse.microprofile.faulttolerance.Retry;
148
import org.eclipse.microprofile.rest.client.annotation.RegisterClientHeaders;
@@ -29,11 +23,10 @@ public interface GitlabRestClient {
2923
* Files
3024
*/
3125

32-
@PUT
33-
@Path("/projects/{id}/repository/files/{file_path}")
26+
@POST
27+
@Path("/projects/{id}/repository/commits")
3428
@Produces("application/json")
35-
File updateFile(@PathParam("id") @Encoded Long projectId, @PathParam("file_path") @Encoded String filePath,
36-
File file);
29+
void createCommit(@PathParam("id") long projectId, Commit commit);
3730

3831
@GET
3932
@Path("/projects/{id}/repository/files/{file_path}")

src/main/java/com/redhat/labs/lodestar/service/ArtifactService.java

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
import javax.json.bind.Jsonb;
1010
import javax.ws.rs.WebApplicationException;
1111

12+
import com.google.gson.Gson;
13+
import com.google.gson.GsonBuilder;
14+
import com.google.gson.JsonElement;
15+
import com.google.gson.JsonObject;
16+
import com.redhat.labs.lodestar.model.gitlab.Action;
17+
import com.redhat.labs.lodestar.model.gitlab.Commit;
1218
import io.quarkus.panache.common.Sort;
1319
import org.eclipse.microprofile.config.inject.ConfigProperty;
1420
import org.eclipse.microprofile.rest.client.inject.RestClient;
@@ -59,6 +65,8 @@ public class ArtifactService {
5965
@Inject
6066
Jsonb jsonb;
6167

68+
Gson gson = new GsonBuilder().setPrettyPrinting().create();
69+
6270
private static final Javers JAVERS = JaversBuilder.javers()
6371
.withListCompareAlgorithm(ListCompareAlgorithm.LEVENSHTEIN_DISTANCE).build();
6472

@@ -150,7 +158,7 @@ public void updateArtifacts(String engagementUuid, String region, List<Artifact>
150158
processObjectChange(cbo, requestArtifacts);
151159

152160
commitMessage.append(cbo.toString());
153-
updateArtifactsFile(engagementUuid, authorEmail, authorName, Optional.ofNullable(commitMessage.toString()));
161+
updateArtifactsFile(engagementUuid, authorEmail.orElse(defaultAuthorEmail), authorName.orElse(defaultAuthorName), Optional.ofNullable(commitMessage.toString()));
154162
if(existing.size() != requestArtifacts.size()) {
155163
engagementRestClient.updateEngagement(engagementUuid, requestArtifacts.size());
156164
}
@@ -336,45 +344,41 @@ void updateArtifact(Artifact artifact, Artifact existing) {
336344
* @param authorName
337345
* @param commitMessage
338346
*/
339-
public void updateArtifactsFile(String engagementUuid, Optional<String> authorEmail,
340-
Optional<String> authorName, Optional<String> commitMessage) {
347+
public void updateArtifactsFile(String engagementUuid, String authorEmail,
348+
String authorName, Optional<String> commitMessage) {
341349

342350
// find project by engagement
343351
Engagement project = engagementRestClient.getEngagementByUuid(engagementUuid);
344352

345353
List<Artifact> artifacts = Artifact.findAllByEngagementUuid(engagementUuid);
346354
String content = jsonb.toJson(artifacts);
347355

348-
// create
349-
File file = createArtifactsFile(content, defaultBranch, authorName, authorEmail, commitMessage);
356+
List<Action> actions = List.of(
357+
Action.builder().filePath(artifactsFile).content(content).build(),
358+
createLegacyEngagementAction(project.getProjectId(), content)
359+
);
360+
361+
Commit commit = Commit.builder().commitMessage(commitMessage.orElse("Artifact Update")).branch(defaultBranch)
362+
.authorEmail(authorEmail).authorName(authorName).actions(actions).build();
350363

351364
// update in git
352-
gitlabRestClient.updateFile(project.getProjectId(), artifactsFile, file);
365+
gitlabRestClient.createCommit(project.getProjectId(), commit);
353366
}
354367

355-
/**
356-
* Creates and returns a {@link File} with the given parameters and encodes the
357-
* content.
358-
*
359-
* @param content
360-
* @param branch
361-
* @param authorName
362-
* @param authorEmail
363-
* @param commitMessage
364-
* @return
365-
*/
366-
File createArtifactsFile(String content, String branch, Optional<String> authorName, Optional<String> authorEmail,
367-
Optional<String> commitMessage) {
368+
Action createLegacyEngagementAction(long projectId, String artifactContent) {
369+
File f = gitlabRestClient.getFile(projectId, "engagement.json", defaultBranch);
370+
f.decodeFileAttributes();
371+
372+
JsonElement element = gson.fromJson(f.getContent(), JsonElement.class);
373+
JsonObject engagement = element.getAsJsonObject();
368374

369-
// create file
370-
File artifactFile = File.builder().filePath(artifactsFile).content(content)
371-
.authorEmail(authorEmail.orElse(defaultAuthorEmail)).authorName(authorName.orElse(defaultAuthorName))
372-
.branch(branch).commitMessage(commitMessage.orElse(defaultCommitMessage)).build();
375+
element = gson.fromJson(artifactContent, JsonElement.class);
373376

374-
// encode before sending
375-
artifactFile.encodeFileAttributes();
377+
engagement.add("artifacts", element);
378+
JsonObject sorted = new JsonObject();
379+
engagement.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(es -> sorted.add(es.getKey(), es.getValue()));
376380

377-
return artifactFile;
381+
return Action.builder().filePath("engagement.json").content(gson.toJson(sorted)).build();
378382

379383
}
380384

src/test/java/com/redhat/labs/mock/ExternalApiWireMock.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,22 @@ public Map<String, String> start() {
4646
.willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(body)));
4747

4848
body = ResourceLoader.load("project-91-artifacts-file.json");
49-
49+
5050
stubFor(get(urlEqualTo("/api/v4/projects/91/repository/files/engagement%2Fartifacts.json?ref=master"))
5151
.willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(body)));
5252

5353
stubFor(get(urlEqualTo("/api/v4/projects/92/repository/files/engagement%2Fartifacts.json?ref=master"))
5454
.willReturn(aResponse().withStatus(404)));
5555

56-
// update existing artifacts.json
56+
body = ResourceLoader.loadGitlabFile("engagement-gitlab-file-1.json");
5757

58-
stubFor(put(urlEqualTo("/api/v4/projects/1/repository/files/engagement%2Fartifacts.json"))
59-
.willReturn(aResponse().withHeader("Content-Type", "application/json").withStatus(200)));
58+
stubFor(get(urlEqualTo("/api/v4/projects/1/repository/files/engagement.json?ref=master"))
59+
.willReturn(aResponse().withHeader("Content-Type", "application/json").withBody(body)));
6060

61-
stubFor(put(urlEqualTo("/api/v4/projects/2/repository/files/engagement%2Fartifacts.json"))
62-
.willReturn(aResponse().withHeader("Content-Type", "application/json").withStatus(200)));
61+
// update existing artifacts.json
6362

63+
stubFor(post(urlMatching("/api/v4/projects/[1-2]/repository/commits"))
64+
.willReturn(aResponse().withHeader("Content-Type", "application/json").withStatus(200)));
6465

6566
stubFor(put(urlMatching("/api/v2/engagements/1111/artifacts/[0-9]")).willReturn(aResponse().withStatus(200)));
6667

src/test/java/com/redhat/labs/mock/ResourceLoader.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.redhat.labs.mock;
22

3+
import com.google.gson.Gson;
34
import org.apache.commons.io.IOUtils;
45

6+
import java.io.File;
57
import java.io.IOException;
68
import java.io.InputStream;
79
import java.nio.charset.StandardCharsets;
@@ -14,4 +16,15 @@ public static String load(String resourceName) {
1416
throw new RuntimeException(e);
1517
}
1618
}
19+
20+
public static String loadGitlabFile(String gitlabResourceName) {
21+
String content = load(gitlabResourceName);
22+
23+
com.redhat.labs.lodestar.model.gitlab.File f = com.redhat.labs.lodestar.model.gitlab.File.builder()
24+
.filePath("a.json").content(content).build();
25+
f.encodeFileAttributes();
26+
27+
return new Gson().toJson(f);
28+
29+
}
1730
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"customer_name": "X",
3+
"name": "Y"
4+
}

0 commit comments

Comments
 (0)