Skip to content

Commit 63cfaad

Browse files
authored
Merge pull request #100 from dwasinge/name-change-uuid
Name change UUID
2 parents 0519975 + 8a91cdb commit 63cfaad

File tree

18 files changed

+1023
-108
lines changed

18 files changed

+1023
-108
lines changed

pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@
103103
<artifactId>vertx-junit5</artifactId>
104104
<scope>test</scope>
105105
</dependency>
106+
<dependency>
107+
<groupId>io.quarkus</groupId>
108+
<artifactId>quarkus-junit5-mockito</artifactId>
109+
</dependency>
106110
</dependencies>
107111
<build>
108112
<plugins>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.redhat.labs.lodestar.exception.mapper;
2+
3+
import java.io.ByteArrayInputStream;
4+
5+
import javax.annotation.Priority;
6+
import javax.ws.rs.WebApplicationException;
7+
import javax.ws.rs.core.Response;
8+
9+
import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper;
10+
11+
@Priority(4000)
12+
public class GitLabServiceResponseMapper implements
13+
ResponseExceptionMapper<RuntimeException> {
14+
@Override
15+
public RuntimeException toThrowable(Response response) {
16+
int status = response.getStatus();
17+
18+
String msg = getBody(response);
19+
20+
return new WebApplicationException(msg, status);
21+
22+
}
23+
24+
private String getBody(Response response) {
25+
ByteArrayInputStream is = (ByteArrayInputStream) response.getEntity();
26+
byte[] bytes = new byte[is.available()];
27+
is.read(bytes,0,is.available());
28+
String body = new String(bytes);
29+
return body;
30+
}
31+
32+
}

src/main/java/com/redhat/labs/lodestar/models/Engagement.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
@AllArgsConstructor
1818
public class Engagement {
1919

20+
private String uuid;
2021
private int projectId;
2122
private String customerName;
2223
private String projectName;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.redhat.labs.lodestar.models;
2+
3+
import java.util.Optional;
4+
5+
import com.redhat.labs.lodestar.models.gitlab.Group;
6+
import com.redhat.labs.lodestar.models.gitlab.Project;
7+
8+
import lombok.AllArgsConstructor;
9+
import lombok.Builder;
10+
import lombok.Data;
11+
import lombok.NoArgsConstructor;
12+
13+
@Data
14+
@Builder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public class ProjectStructure {
18+
19+
@Builder.Default
20+
private Optional<Integer> customerGroupId = Optional.empty();
21+
@Builder.Default
22+
private Optional<Group> customerGroup = Optional.empty();
23+
@Builder.Default
24+
private Boolean customerGroupHasSubgroups = Boolean.FALSE;
25+
26+
@Builder.Default
27+
private Optional<Integer> projectGroupId = Optional.empty();
28+
@Builder.Default
29+
private Optional<Group> projectGroup = Optional.empty();
30+
31+
@Builder.Default
32+
private Optional<Project> project = Optional.empty();
33+
34+
}

src/main/java/com/redhat/labs/lodestar/models/gitlab/Project.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,12 @@ public class Project {
133133
private Boolean packagesEnabled;
134134
@JsonbProperty("path_with_namespace")
135135
private String pathWithNamespace;
136-
136+
private Namespace namespace;
137137

138138
@JsonbTransient
139139
private boolean first;
140+
@JsonbTransient
141+
private boolean moved;
140142

141143
// TODO: Can expose avatar as well, just need to figure out what type to use.
142144
// avatar mixed no Image file for avatar of the group. Introduced in GitLab 12.9
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.redhat.labs.lodestar.models.gitlab;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
public class ProjectTransfer {
13+
14+
private Integer id;
15+
private Integer namespace;
16+
17+
}

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.redhat.labs.lodestar.rest.client;
22

33
import java.util.List;
4+
import java.util.Optional;
45

56
import javax.ws.rs.Consumes;
67
import javax.ws.rs.DELETE;
@@ -14,19 +15,23 @@
1415
import javax.ws.rs.core.Response;
1516

1617
import org.eclipse.microprofile.rest.client.annotation.ClientHeaderParam;
18+
import org.eclipse.microprofile.rest.client.annotation.RegisterProvider;
1719
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
1820
import org.jboss.resteasy.annotations.jaxrs.PathParam;
1921

22+
import com.redhat.labs.lodestar.exception.mapper.GitLabServiceResponseMapper;
2023
import com.redhat.labs.lodestar.models.gitlab.CommitMultiple;
2124
import com.redhat.labs.lodestar.models.gitlab.DeployKey;
2225
import com.redhat.labs.lodestar.models.gitlab.File;
2326
import com.redhat.labs.lodestar.models.gitlab.Group;
2427
import com.redhat.labs.lodestar.models.gitlab.Hook;
2528
import com.redhat.labs.lodestar.models.gitlab.Project;
29+
import com.redhat.labs.lodestar.models.gitlab.ProjectTransfer;
2630
import com.redhat.labs.lodestar.resources.filter.Logged;
2731

2832
@Path("/api/v4")
2933
@RegisterRestClient(configKey = "gitlab.api")
34+
@RegisterProvider(value = GitLabServiceResponseMapper.class, priority = 50)
3035
@ClientHeaderParam(name = "Private-Token", value = "{com.redhat.labs.lodestar.config.GitLabConfig.getPersonalAccessToken}")
3136
public interface GitLabService {
3237

@@ -40,7 +45,7 @@ public interface GitLabService {
4045
//reference: https://docs.gitlab.com/ee/api/groups.html#list-a-groups-subgroups
4146
@GET
4247
@Path("/groups/{id}/subgroups")
43-
List<Group> getSubGroups(@PathParam("id") @Encoded Integer groupId);
48+
Response getSubGroups(@PathParam("id") @Encoded Integer groupId, @QueryParam("per_page") Integer perPage, @QueryParam("page") Integer page);
4449

4550
// reference: https://docs.gitlab.com/ee/api/groups.html#new-group
4651
@POST
@@ -132,6 +137,12 @@ public interface GitLabService {
132137
@Consumes("application/json")
133138
List<Hook> getProjectHooks(@PathParam("id") @Encoded Integer projectId);
134139

140+
@PUT
141+
@Logged
142+
@Path("/projects/{id}/transfer")
143+
@Produces("application/json")
144+
Optional<Project> transferProject(@PathParam("id") @Encoded Integer projectId, ProjectTransfer projectTransfer);
145+
135146
// FILES
136147

137148
@GET

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

Lines changed: 7 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
public class EngagementService {
3535
public static final Logger LOGGER = LoggerFactory.getLogger(EngagementService.class);
3636

37-
private static final String ENGAGEMENT_PROJECT_NAME = "iac";
3837
private static final String DEFAULT_BRANCH = "master";
3938
private static final String ENGAGEMENT_FILE = "engagement.json";
4039
private static final String STATUS_FILE = "status.json";
@@ -62,6 +61,9 @@ public class EngagementService {
6261
@Inject
6362
HookService hookService;
6463

64+
@Inject
65+
ProjectStructureService structureService;
66+
6567
@Inject
6668
JsonMarshaller json;
6769

@@ -84,7 +86,7 @@ public void setPathPrefix() {
8486
public Project createEngagement(Engagement engagement, String author, String authorEmail) {
8587

8688
// create project structure
87-
Project project = createProjectStucture(engagement);
89+
Project project = structureService.createOrUpdateProjectStructure(engagement, engagementPathPrefix);
8890
engagement.setProjectId(project.getId());
8991

9092
// get commit message before creating file
@@ -123,7 +125,7 @@ public Project createEngagement(Engagement engagement, String author, String aut
123125
}
124126

125127
public List<Commit> getCommitLog(String customerName, String engagementName) {
126-
String projectPath = getPath(customerName, engagementName);
128+
String projectPath = GitLabPathUtils.getPath(engagementPathPrefix, customerName, engagementName);
127129
return projectService.getCommitLog(projectPath);
128130
}
129131

@@ -154,7 +156,7 @@ public Response createHook(String customerName, String engagementName, Hook hook
154156

155157
public Status getProjectStatus(String customerName, String engagementName) {
156158
Status status = null;
157-
Optional<File> file = fileService.getFile(this.getPath(customerName, engagementName), STATUS_FILE);
159+
Optional<File> file = fileService.getFile(GitLabPathUtils.getPath(engagementPathPrefix, customerName, engagementName), STATUS_FILE);
158160
if(file.isPresent()) {
159161
status = json.fromJson(file.get().getContent(), Status.class);
160162
}
@@ -163,7 +165,7 @@ public Status getProjectStatus(String customerName, String engagementName) {
163165
}
164166

165167
public Optional<Project> getProject(String customerName, String engagementName) {
166-
String fullPath = this.getPath(customerName, engagementName);
168+
String fullPath = GitLabPathUtils.getPath(engagementPathPrefix, customerName, engagementName);
167169

168170
LOGGER.debug("Full path {}", fullPath);
169171
return projectService.getProjectByIdOrPath(fullPath);
@@ -251,70 +253,6 @@ private File createEngagmentFile(Engagement engagement) {
251253
return File.builder().content(fileContent).filePath(ENGAGEMENT_FILE).build();
252254
}
253255

254-
private Project createProjectStucture(Engagement engagement) {
255-
256-
// create group for customer name
257-
Group customerGroup = getOrCreateGroup(engagement.getCustomerName(),
258-
Group.builder().name(engagement.getCustomerName())
259-
.path(GitLabPathUtils.generateValidPath(engagement.getCustomerName()))
260-
.parentId(engagementRepositoryId).build());
261-
262-
// create group for project name
263-
Group projectGroup = getOrCreateGroup(engagement.getProjectName(),
264-
Group.builder().name(engagement.getProjectName())
265-
.path(GitLabPathUtils.generateValidPath(engagement.getProjectName()))
266-
.parentId(customerGroup.getId()).build());
267-
268-
// create project under project name group
269-
Project project = getOrCreateProject(projectGroup.getId(), ENGAGEMENT_PROJECT_NAME, Project.builder()
270-
.name(ENGAGEMENT_PROJECT_NAME).visibility("private").namespaceId(projectGroup.getId()).build());
271-
272-
// enable deployment key on project
273-
projectService.enableDeploymentKeyOnProject(project.getId(), deployKey);
274-
275-
return project;
276-
277-
}
278-
279-
private Group getOrCreateGroup(String groupName, Group groupToCreate) {
280-
281-
Optional<Group> optional = groupService.getGitLabGroupByName(groupName, groupToCreate.getParentId());
282-
283-
if (!optional.isPresent()) {
284-
285-
// try to create group
286-
optional = groupService.createGitLabGroup(groupToCreate);
287-
288-
if (!optional.isPresent()) {
289-
throw new UnexpectedGitLabResponseException("failed to create group");
290-
}
291-
292-
}
293-
294-
return optional.get();
295-
296-
}
297-
298-
private Project getOrCreateProject(Integer namespaceId, String projectName, Project project) {
299-
300-
Optional<Project> optional = projectService.getProjectByName(namespaceId, projectName);
301-
302-
if (!optional.isPresent()) {
303-
304-
// try to create project
305-
optional = projectService.createProject(project);
306-
307-
if (!optional.isPresent()) {
308-
throw new UnexpectedGitLabResponseException("failed to create project");
309-
}
310-
311-
optional.get().setFirst(true);
312-
}
313-
314-
return optional.get();
315-
316-
}
317-
318256
private CommitMultiple createCommitMultiple(List<File> filesToCommit, Integer projectId, String branch,
319257
String authorName, String authorEmail, boolean isNew, Optional<String> commitMessageOptional) {
320258

@@ -361,14 +299,5 @@ private String getEmoji() {
361299

362300
return String.valueOf(mysteryEmoji);
363301
}
364-
365-
private String getPath(String customerName, String engagementName) {
366-
return new StringBuilder(engagementPathPrefix)
367-
.append("/")
368-
.append(customerName)
369-
.append("/")
370-
.append(engagementName)
371-
.append("/iac").toString();
372-
}
373302

374303
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,20 @@ public Optional<Group> getGitLabGroupByName(String name, Integer parentId)
5252
return optional;
5353

5454
}
55-
55+
56+
public List<Group> getSubgroups(Integer groupId) {
57+
58+
PagedResults<Group> page = new PagedResults<>();
59+
60+
while(page.hasMore()) {
61+
Response response = gitLabService.getSubGroups(groupId, commitPageSize, page.getNumber());
62+
page.update(response, new GenericType<List<Group>>() {});
63+
}
64+
65+
return page.getResults();
66+
67+
}
68+
5669
public Optional<Group> getGitLabGroupByById(int id) {
5770
return getGitLabGroupByByIdOrPath(String.valueOf(id));
5871
}

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import javax.enterprise.context.ApplicationScoped;
88
import javax.inject.Inject;
9+
import javax.ws.rs.WebApplicationException;
910
import javax.ws.rs.core.GenericType;
1011
import javax.ws.rs.core.Response;
1112

@@ -19,6 +20,7 @@
1920
import com.redhat.labs.lodestar.models.gitlab.DeployKey;
2021
import com.redhat.labs.lodestar.models.gitlab.Project;
2122
import com.redhat.labs.lodestar.models.gitlab.ProjectSearchResults;
23+
import com.redhat.labs.lodestar.models.gitlab.ProjectTransfer;
2224
import com.redhat.labs.lodestar.rest.client.GitLabService;
2325

2426
@ApplicationScoped
@@ -84,8 +86,19 @@ public Optional<Project> getProjectById(Integer projectId) {
8486
}
8587

8688
public Optional<Project> getProjectByIdOrPath(String idOrPath) {
87-
Project project = gitLabService.getProjectById(idOrPath);
88-
return Optional.ofNullable(project);
89+
90+
try {
91+
return Optional.ofNullable(gitLabService.getProjectById(idOrPath));
92+
} catch(WebApplicationException wae) {
93+
94+
if(wae.getResponse().getStatus() == 404) {
95+
return Optional.empty();
96+
}
97+
98+
throw wae;
99+
100+
}
101+
89102
}
90103

91104
// create a project
@@ -102,6 +115,7 @@ public Optional<Project> createProject(Project project) {
102115
// try to create project
103116
Project createdProject = gitLabService.createProject(project);
104117
if (null != createdProject) {
118+
createdProject.setFirst(true);
105119
optional = Optional.of(createdProject);
106120
}
107121

@@ -147,6 +161,13 @@ public List<Commit> getCommitLog(String projectId) {
147161
LOGGER.debug("total commits for project {} {}", projectId, page.size());
148162

149163
return page.getResults().stream().filter(e -> !commitFilteredEmails.contains(e.getAuthorEmail())).collect(Collectors.toList());
164+
165+
}
166+
167+
public Optional<Project> transferProject(Integer projectId, Integer newGroupId) {
168+
169+
return gitLabService.transferProject(projectId, ProjectTransfer.builder().id(projectId).namespace(newGroupId).build());
170+
150171
}
151172

152173
}

0 commit comments

Comments
 (0)