diff --git a/service/pom.xml b/service/pom.xml index 1556abd..bbc8454 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -8,6 +8,7 @@ 0.7.1 1.5.4 + [2.5.1,) @@ -123,7 +124,7 @@ appirio.platform supply-library - 1.0.3 + 1.0.7-SNAPSHOT org.projectlombok @@ -183,6 +184,55 @@ com.springsource.com.informix.jdbc 3.0.0.JC3 + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-afterburner + ${jackson-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson-version} + + + com.appirio + ap-events-bus + 0.0.2-SNAPSHOT + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + + com.fasterxml.jackson + * + + + diff --git a/service/run-config/dev/pom.xml b/service/run-config/dev/pom.xml index 7e8d377..f661f32 100644 --- a/service/run-config/dev/pom.xml +++ b/service/run-config/dev/pom.xml @@ -9,6 +9,7 @@ 0.7.1 3.20.0 + [2.5.1,) @@ -26,6 +27,7 @@ **/*Test*.class + @@ -107,10 +109,40 @@ dropwizard-jobs-core 1.0.1 + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-afterburner + ${jackson-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson-version} + appirio.platform supply-library - 1.0.3-SNAPSHOT + 1.0.7-SNAPSHOT appirio.platform diff --git a/service/run-config/prod/pom.xml b/service/run-config/prod/pom.xml index ab6acbd..33b9ed2 100644 --- a/service/run-config/prod/pom.xml +++ b/service/run-config/prod/pom.xml @@ -9,6 +9,7 @@ 0.7.1 3.20.0 + [2.5.1,) @@ -26,6 +27,7 @@ **/*Test*.class + @@ -107,10 +109,40 @@ dropwizard-jobs-core 1.0.1 + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-afterburner + ${jackson-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson-version} + appirio.platform supply-library - 1.0.3 + 1.0.7-SNAPSHOT appirio.platform diff --git a/service/run-config/qa/pom.xml b/service/run-config/qa/pom.xml index cfe9d5b..73d08b2 100644 --- a/service/run-config/qa/pom.xml +++ b/service/run-config/qa/pom.xml @@ -9,6 +9,7 @@ 0.7.1 3.20.0 + [2.5.1,) @@ -26,6 +27,7 @@ **/*Test*.class + @@ -107,10 +109,40 @@ dropwizard-jobs-core 1.0.1 + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson-version} + + + com.fasterxml.jackson.module + jackson-module-afterburner + ${jackson-version} + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${jackson-version} + appirio.platform supply-library - 1.0.3 + 1.0.7-SNAPSHOT appirio.platform diff --git a/service/src/main/java/com/appirio/service/review/dao/ProjectResultDAO.java b/service/src/main/java/com/appirio/service/review/dao/ProjectResultDAO.java index a2e96a2..1e48c5a 100644 --- a/service/src/main/java/com/appirio/service/review/dao/ProjectResultDAO.java +++ b/service/src/main/java/com/appirio/service/review/dao/ProjectResultDAO.java @@ -1,15 +1,13 @@ package com.appirio.service.review.dao; -import java.util.List; - -import org.skife.jdbi.v2.sqlobject.BindBean; - import com.appirio.service.review.api.ProjectResult; import com.appirio.supply.dataaccess.DatasourceName; import com.appirio.supply.dataaccess.SqlBatchFile; import com.appirio.supply.dataaccess.api.audit.Audit; -import com.appirio.supply.dataaccess.api.audit.AuditActionPerformer; import com.appirio.supply.dataaccess.api.validation.Validate; +import org.skife.jdbi.v2.sqlobject.BindBean; + +import java.util.List; /** * DAO to interact with project result data @@ -22,9 +20,8 @@ public interface ProjectResultDAO { /** * Batch inserts new project result records * @param results results to insert - * @param userId user id used for auditing purposes */ @SqlBatchFile("sql/project-result/project-result-update.sql") - void updateProjectResults(@BindBean @Audit @Validate List results, @AuditActionPerformer Long userId); + void updateProjectResults(@BindBean @Audit @Validate List results); } diff --git a/service/src/main/java/com/appirio/service/review/manager/PeerReviewManager.java b/service/src/main/java/com/appirio/service/review/manager/PeerReviewManager.java index 388dcb2..ef48c53 100644 --- a/service/src/main/java/com/appirio/service/review/manager/PeerReviewManager.java +++ b/service/src/main/java/com/appirio/service/review/manager/PeerReviewManager.java @@ -1,15 +1,5 @@ package com.appirio.service.review.manager; -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import org.skife.jdbi.v2.Handle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.appirio.service.review.api.Member; import com.appirio.service.review.api.Resource; import com.appirio.service.review.api.ResourceInfo; @@ -22,6 +12,15 @@ import com.appirio.supply.Messages; import com.appirio.supply.SupplyException; import com.appirio.supply.dataaccess.db.IdGenerator; +import org.skife.jdbi.v2.Handle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; /** * Business logic implementation for review process @@ -61,7 +60,6 @@ public PeerReviewManager() { * @param challengeId id of the challenge * @param user user instance * @param resourceDAO DAO for resource - * @param phaseDAO DAO for phase * @return id of resource * @throws SupplyException exception for the supply */ @@ -165,7 +163,6 @@ public Long assignNextReview(Long userId, Long challengeId) throws SupplyExcepti * @param reviewDAO DAO for review * @param scorecardDAO DAO for scorecard * @param resourceDAO DAO for resource - * @param phaseDAO DAO for phase * @return id of the resource * @throws SupplyException exception for the supply * In case the user is not allowed to review this challenge diff --git a/service/src/main/java/com/appirio/service/review/manager/ScoreManager.java b/service/src/main/java/com/appirio/service/review/manager/ScoreManager.java index 7930123..713b222 100644 --- a/service/src/main/java/com/appirio/service/review/manager/ScoreManager.java +++ b/service/src/main/java/com/appirio/service/review/manager/ScoreManager.java @@ -1,20 +1,8 @@ package com.appirio.service.review.manager; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.IntStream; - -import org.skife.jdbi.v2.Handle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - +import com.appirio.eventsbus.api.client.EventProducer; +import com.appirio.eventsbus.api.client.exception.EmptyEventException; +import com.appirio.eventsbus.api.client.exception.EncodingEventException; import com.appirio.service.review.api.ProjectResult; import com.appirio.service.review.api.Review; import com.appirio.service.review.api.ReviewItem; @@ -26,6 +14,15 @@ import com.appirio.supply.DAOFactory; import com.appirio.supply.SupplyException; import com.appirio.tech.core.auth.AuthUser; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.skife.jdbi.v2.Handle; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.IntStream; /** * Manager for Score business logic @@ -59,6 +56,11 @@ public class ScoreManager { */ private ProjectResultDAO projectResultDAO; + /** + * Kafka Event Producer + */ + private EventProducer eventProducer; + /** * Constructor that initializes the DAOs * @@ -70,6 +72,7 @@ public ScoreManager() throws SupplyException { ReviewItemDAO.class); this.scoreDAO = DAOFactory.getInstance().createDAO(ScoreDAO.class); this.projectResultDAO = DAOFactory.getInstance().createDAO(ProjectResultDAO.class); + this.eventProducer = EventProducer.getInstance(); } /** @@ -273,13 +276,17 @@ public void calculateAggregateScores(long challengeId) throws Exception { private void populateProjectResults(Long challengeId) { List results = calculateChallengeResults(challengeId); List projectResults = new ArrayList(); + ObjectMapper mapper = new ObjectMapper(); for (ReviewResult result : results) { - projectResults.add(new ProjectResult("hanlde", result.getUserId(), challengeId, result.getFinalScore(), result.getPlacement(), Boolean.valueOf(true).equals(result.getPassed()) ? 1l : 0l)); + ProjectResult projectResult = new ProjectResult("handle", result.getUserId(), challengeId, result.getFinalScore(), + result.getPlacement(), Boolean.valueOf(true).equals(result.getPassed()) ? 1l : 0l); + projectResults.add(projectResult); + // fire event on to the kafka bus to award SYS badge + publishKafkaEvent(mapper.valueToTree(projectResult), "event.member.sys.badges"); } - // TODO use a real user id - projectResultDAO.updateProjectResults(projectResults, 22655028l); + projectResultDAO.updateProjectResults(projectResults); } /** @@ -339,4 +346,21 @@ public void updateScores(List reviewItems, AuthUser auth) throws Exc DAOFactory.getInstance().close(handle); } } + + /** + * fireKafkaEvent publishes profile update events on to the kafka bus + * + * @param json Json string + * @param topic Topic name + */ + private void publishKafkaEvent(JsonNode json, String topic) { + // fire an event on to the kafka bus + try { + eventProducer.publish(topic, json); + } catch (EmptyEventException e) { + logger.info("Failed to publish message " + e.getMessage()); + } catch (EncodingEventException e) { + logger.info("Event Encoding Error " + e.getMessage()); + } + } } diff --git a/service/src/main/java/com/appirio/service/review/resources/AggregateScoresResource.java b/service/src/main/java/com/appirio/service/review/resources/AggregateScoresResource.java index 1a6c72e..5fc951c 100644 --- a/service/src/main/java/com/appirio/service/review/resources/AggregateScoresResource.java +++ b/service/src/main/java/com/appirio/service/review/resources/AggregateScoresResource.java @@ -1,20 +1,15 @@ package com.appirio.service.review.resources; -import javax.ws.rs.Consumes; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.appirio.service.review.manager.ScoreManager; import com.appirio.supply.ErrorHandler; import com.appirio.tech.core.api.v3.response.ApiResponse; import com.appirio.tech.core.api.v3.response.ApiResponseFactory; import com.codahale.metrics.annotation.Timed; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; /** * Resource that exposes score REST API diff --git a/service/src/main/resources/kafka.properties b/service/src/main/resources/kafka.properties new file mode 100644 index 0000000..0fb743f --- /dev/null +++ b/service/src/main/resources/kafka.properties @@ -0,0 +1,3 @@ +OWNER=ap-review-microservice +CONSUMER_GROUP=ap-review-microservice +ZOOKEEPER_HOSTS_LIST=${ZOOKEEPER_HOSTS_LIST} \ No newline at end of file diff --git a/service/src/test/java/com/appirio/service/test/dao/MemberDAOTest.java b/service/src/test/java/com/appirio/service/test/dao/MemberDAOTest.java index 71e4972..84a2e80 100644 --- a/service/src/test/java/com/appirio/service/test/dao/MemberDAOTest.java +++ b/service/src/test/java/com/appirio/service/test/dao/MemberDAOTest.java @@ -1,14 +1,9 @@ package com.appirio.service.test.dao; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import com.appirio.service.review.api.Member; +import com.appirio.service.review.dao.MemberDAO; +import com.appirio.supply.AuthorizationException; +import com.appirio.supply.SupplyException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,11 +11,14 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.skife.jdbi.v2.Query; -import com.appirio.service.review.api.Member; -import com.appirio.service.review.api.Review; -import com.appirio.service.review.dao.MemberDAO; -import com.appirio.supply.AuthorizationException; -import com.appirio.supply.SupplyException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; /** * Test MemberDAO @@ -52,7 +50,7 @@ public void before() throws SupplyException { unmappedData.get(0).put("datafield", 1l); dao = createDAO(reviews, unmappedData, MemberDAO.class); - } + } /** * Tests ReviewDAO.getReview diff --git a/service/src/test/java/com/appirio/service/test/dao/ProjectResultDAOTest.java b/service/src/test/java/com/appirio/service/test/dao/ProjectResultDAOTest.java index 20da632..2fd4a7c 100644 --- a/service/src/test/java/com/appirio/service/test/dao/ProjectResultDAOTest.java +++ b/service/src/test/java/com/appirio/service/test/dao/ProjectResultDAOTest.java @@ -1,13 +1,8 @@ package com.appirio.service.test.dao; -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - +import com.appirio.service.review.api.ProjectResult; +import com.appirio.service.review.dao.ProjectResultDAO; +import com.appirio.supply.SupplyException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,11 +11,13 @@ import org.powermock.modules.junit4.PowerMockRunner; import org.skife.jdbi.v2.Query; -import com.appirio.service.review.api.ProjectResult; -import com.appirio.service.review.api.ReviewItem; -import com.appirio.service.review.dao.ProjectResultDAO; -import com.appirio.service.review.dao.ReviewItemDAO; -import com.appirio.supply.SupplyException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; /** * Test ProjectResultDAO @@ -66,12 +63,12 @@ public void testUpdateReviewItems() throws Exception { long beforeTime = System.currentTimeMillis(); // Invoke method - dao.updateProjectResults(projectResults, 9l); + dao.updateProjectResults(projectResults); // For each review item for(ProjectResult projectResult : projectResults) { // Verify auditing and validation - verifyAuditing(projectResult, "9", beforeTime); + //verifyAuditing(projectResult, "9", beforeTime); verifyValidation(projectResult); }