Skip to content

Commit

Permalink
Move status querying to mongo (#23)
Browse files Browse the repository at this point in the history
* fix current status in gitlab

* query status in mongo rather than in java
  • Loading branch information
mcanoy authored May 17, 2022
1 parent 4034ce6 commit ee9529e
Show file tree
Hide file tree
Showing 8 changed files with 84 additions and 46 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@
import java.time.Instant;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import javax.enterprise.context.ApplicationScoped;

import com.redhat.labs.lodestar.engagements.model.EngagementState;
import org.bson.conversions.Bson;

import com.mongodb.client.model.Field;
Expand Down Expand Up @@ -58,23 +60,23 @@ public List<Engagement> getEngagements(PageFilter pageFilter, Set<String> region
.page(pageFilter.getPage(), pageFilter.getPageSize()).list();
}

public long countEngagements(String searchInput, String category, Set<String> regions, Set<String> types) {
Bson finalQuery = createQuery(searchInput, category, regions, types);
public long countEngagements(String searchInput, String category, Set<String> regions, Set<String> types, Set<EngagementState> states) {
Bson finalQuery = createQuery(searchInput, category, regions, types, states);
return mongoCollection().countDocuments(finalQuery);
}

public List<Engagement> findEngagements(PageFilter pageFilter, String searchInput, String category, Set<String> regions, Set<String> types) {
public List<Engagement> findEngagements(PageFilter pageFilter, String searchInput, String category, Set<String> regions, Set<String> types, Set<EngagementState> states) {

Bson finalQuery = createQuery(searchInput, category, regions, types);
Bson finalQuery = createQuery(searchInput, category, regions, types, states);

return mongoCollection().find(finalQuery).sort(pageFilter.getBsonSort()).skip(pageFilter.getStartAt()).limit(pageFilter.getPageSize()).into(new ArrayList<>());
}

private Bson createQuery(String searchInput, String category, Set<String> regions, Set<String> types) {
private Bson createQuery(String searchInput, String category, Set<String> regions, Set<String> types, Set<EngagementState> states) {
List<Bson> ands = new ArrayList<>();

if(searchInput != null) {
Pattern p = Pattern.compile(searchInput, Pattern.CASE_INSENSITIVE);
Pattern p = Pattern.compile(Pattern.quote(searchInput), Pattern.CASE_INSENSITIVE);
Bson query = or(
regex("customerName", p),
regex("name", p));
Expand All @@ -93,20 +95,21 @@ private Bson createQuery(String searchInput, String category, Set<String> region
ands.add(in("type", types));
}

if(!states.isEmpty()) {
Set<String> statusValues = states.stream().map(st -> st.toString()).collect(Collectors.toSet());
ands.add(in("currentState", statusValues));
}

return and(ands);
}

public List<Engagement> findEngagementsWithoutLastUpdate() {
return list("lastUpdate is null");
}

public long countEngagements(Set<String> regions, Set<String> types) {
Query query = queryEngagements(regions, types);
return count(query.value, query.parameters);
}

private Query queryEngagements(Set<String> regions, Set<String> types) {
return queryEngagements(regions, types, null);
public long countEngagements(Set<String> regions, Set<String> types, Set<EngagementState> states) {
Bson query = createQuery(null, null, regions, types, states);
return mongoCollection().countDocuments(query);
}

private Query queryEngagements(Set<String> regions, Set<String> types, String category) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ public Response getEngagements(@BeanParam PageFilter pagingFilter, @QueryParam("

List<Engagement> engagements;
long total = 0;
if(search == null && category == null && region.isEmpty() && types.isEmpty()) {
engagements = engagementService.getEngagements(states); //System should calc state daily (it doesn't)
if(search == null && category == null && region.isEmpty() && types.isEmpty() && states.isEmpty()) {
engagements = engagementService.getEngagements();
total = engagements.size();
} else {
engagements = engagementService.findEngagements(pagingFilter, search, category, region, types, states);
total = engagementService.countEngagements(search, category, region, types);
total = engagementService.countEngagements(search, category, region, types, states);
}
return Response.ok(engagements).header(TOTAL_HEADER, total).build(); //no paging yet
}
Expand All @@ -59,16 +59,17 @@ public Response getEngagements(@QueryParam("inStates") Set<EngagementState> stat
if(states.isEmpty()) {
return Response.status(Response.Status.BAD_REQUEST).entity(new ErrorMessage("State list is empty")).build();
}
List<Engagement> engagements = engagementService.getEngagements(states);
return Response.ok(engagements).header(TOTAL_HEADER, engagements.size()).build();
List<Engagement> engagements = engagementService.findEngagements(new PageFilter(), null, null, Collections.emptySet(), Collections.emptySet(), states);
long total = engagementService.countEngagements(null, null, Collections.emptySet(), Collections.emptySet(), states);
return Response.ok(engagements).header(TOTAL_HEADER, total).build();
}


@GET
@Path("category/{category}")
@Operation(summary = "Gets a list of engagements that have use the category input.")
public Response getEngagementWithCategory(@PathParam("category") String category, @BeanParam PageFilter pagingFilter,
@QueryParam("region") Set<String> region, @QueryParam("types") Set<String> types, @QueryParam("inStates") Set<EngagementState> states ) {
@QueryParam("region") Set<String> region, @QueryParam("types") Set<String> types, @QueryParam("inStates") Set<EngagementState> states) {
List<Engagement> engagements = engagementService.getEngagementsWithCategory(category, pagingFilter, region, types, states);
return Response.ok(engagements).header(TOTAL_HEADER, engagements.size()).build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public class GitlabApiClient {
private static final String SUMMARY_MESSAGE = "Summary Update";
private static final String DEPLOYMENT_KEY_PREFIX = "LodeStar";
private static final String DEPLOYMENT_KEY_POSTFIX = "DK";
private static final String ENGAGEMENT_JSON = "engagement.json";

@ConfigProperty(name = "file.engagement")
String engagementFile;
Expand Down Expand Up @@ -189,11 +190,11 @@ public Optional<Engagement> getEngagement(Integer projectId) {

public String getLegacyEngagement(Integer projectId) {
try {
RepositoryFile file = gitlabApi.getRepositoryFileApi().getFile(projectId, "engagement.json", branch);
RepositoryFile file = gitlabApi.getRepositoryFileApi().getFile(projectId, ENGAGEMENT_JSON, branch);
return new String(file.getDecodedContentAsBytes(), StandardCharsets.UTF_8);
} catch (GitLabApiException e) {
if(e.getHttpStatus() == 404) {
LOGGER.debug("Could find not legacy file {} for project {}", "engagement.json", projectId);
LOGGER.debug("Could find not legacy file {} for project {}", ENGAGEMENT_JSON, projectId);
return null;
}
throw new EngagementGitlabException(e.getHttpStatus(), e.getReason(), "Legacy Engagement File Not Retrieved " + projectId);
Expand Down Expand Up @@ -425,7 +426,7 @@ public void createEngagementFiles(Engagement engagement, String legacy) {

action = new CommitAction()
.withAction(Action.CREATE)
.withFilePath("engagement.json")
.withFilePath(ENGAGEMENT_JSON)
.withContent(legacy);

commitFiles.add(action);
Expand Down Expand Up @@ -492,7 +493,7 @@ public void updateEngagementFile(Engagement engagement, String legacy) {

action = new CommitAction()
.withAction(Action.UPDATE)
.withFilePath("engagement.json")
.withFilePath(ENGAGEMENT_JSON)
.withContent(legacy);

commitActions.add(action);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,47 +269,32 @@ public List<Engagement> getEngagements(PageFilter pageFilter, Set<String> region

}

public long countEngagements(String input, String category, Set<String> regions, Set<String> types) {
return engagementRepository.countEngagements(input, category, regions, types);
public long countEngagements(String input, String category, Set<String> regions, Set<String> types, Set<EngagementState> states) {
return engagementRepository.countEngagements(input, category, regions, types, states);
}

public List<Engagement> findEngagements(PageFilter pageFilter, String input, String category, Set<String> regions, Set<String> types, Set<EngagementState> states) {
List<Engagement> engagements = engagementRepository.findEngagements(pageFilter, input, category, regions, types);

if(states.isEmpty()) {
return engagements;
}

return filterEngagementsByState(engagements, states);
return engagementRepository.findEngagements(pageFilter, input, category, regions, types, states);
}

public List<Engagement> filterEngagementsByState(List<Engagement> engagements, Set<EngagementState> states) {
return engagements.stream().filter(e -> states.contains(e.getState())).collect(Collectors.toList());
}

public List<Engagement> getEngagements(Set<EngagementState> states) {
List<Engagement> engagements = getEngagements();

if(states.isEmpty()) {
return engagements;
}
return filterEngagementsByState(engagements, states);
return getEngagements();
}

public long countAll() {
return engagementRepository.count();
}

public long count(Set<String> regions, Set<String> types, Set<EngagementState> inStates) {
if(inStates.isEmpty()) {
return engagementRepository.countEngagements(regions, types);
}

return getEngagements(PageFilter.builder().page(0).pageSize(1000).build(), regions, types, inStates).size();
return engagementRepository.countEngagements(regions, types, inStates);
}

public long countRegions(Set<String> regions, Set<String> types) {
return engagementRepository.countEngagements(regions, types);
return engagementRepository.countEngagements(regions, types, Collections.emptySet());
}

public List<Engagement> getEngagementsWithCategory(String category, PageFilter pageFilter, Set<String> regions, Set<String> types, Set<EngagementState> inStates) {
Expand Down Expand Up @@ -367,6 +352,7 @@ public long refreshSelect(Set<String> uuids) {
public long refresh() {
LOGGER.debug("Refresh");
List<Engagement> engagements = gitlabService.getEngagements();
engagements.forEach(e -> e.setCurrentState(e.getState()));
participantService.addEngagementCount(engagements);
artifactService.addEngagementCount(engagements);
activityService.getLastActivityPerEngagement(engagements);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,18 @@ public Map<String, String> start() {
.withBody(body)
));

stubFor(get(urlEqualTo("/api/v4/projects/8675309/repository/files/engagement%2Fengagement%2Ejson?ref=master")).willReturn(aResponse()
.withStatus(500)
.withHeader("Content-Type", "application/json")
.withBody("{\"msg\": \" 500 Something bad happened\"}")
));

stubFor(get(urlEqualTo("/api/v4/projects/8675308/repository/files/engagement%2Fengagement%2Ejson?ref=master")).willReturn(aResponse()
.withStatus(404)
.withHeader("Content-Type", "application/json")
.withBody("{\"msg\": \" 500 Something bad happened\"}")
));

stubFor(get(urlEqualTo("/api/v4/projects/12/repository/files/engagement%2Ejson?ref=master")).willReturn(aResponse()
.withStatus(200)
.withHeader("Content-Type", "application/json")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
@TestHTTPEndpoint(EngagementResource.class)
@QuarkusTestResource(ExternalApiWireMock.class)
class EngagementResourceTest {

private static final String AUTHOR = "Mitch";
private static final String AUTHOR_EMAIL = "[email protected]";

Expand Down Expand Up @@ -101,7 +102,7 @@ void testGetAllEngagementsForState() {

@Test
void testGetEngagementsForTypeRegionAndState() {
engagementService.create(Engagement.builder().name("unit test").customerName("blue hat").region("latam").type("Residency").build());
engagementService.create(Engagement.builder().name("unit test").customerName("blue hat").region("latam").type("Residency").currentState(EngagementState.UPCOMING).build());

given().queryParam("inStates", EngagementState.UPCOMING)
.queryParam("region", "na")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.redhat.labs.lodestar.engagements.rest.client;

import com.redhat.labs.lodestar.engagements.exception.EngagementGitlabException;
import com.redhat.labs.lodestar.engagements.model.Engagement;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;
import java.util.Optional;

@QuarkusTest
class GitlabApiClientTest {

@Inject
GitlabApiClient gitlabApiClient;

@Test
void getEngagementException() {
EngagementGitlabException ex = Assertions.assertThrows(EngagementGitlabException.class, () -> {
gitlabApiClient.getEngagement(8675309);
});

Assertions.assertEquals(500, ex.getStatusCode());
}

@Test
void getEngagementNotFound() {
Optional<Engagement> option = gitlabApiClient.getEngagement(8675308);

Assertions.assertTrue(option.isEmpty());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ void testLastUpdate() {

engagementService.checkLastUpdate();
engagement = engagementService.getEngagement(uuid).orElse(null);
assertTrue(engagement.getLastUpdate() != null);
assertNotNull(engagement);
assertNotNull(engagement.getLastUpdate());
}

@Test
Expand Down

0 comments on commit ee9529e

Please sign in to comment.