diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 67e9f8925d..0000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,4 +0,0 @@
-[submodule "actors/sunbird-lms-mw"]
- path = actors/sunbird-lms-mw
- url = https://github.com/project-sunbird/sunbird-lms-mw.git
- branch = master
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index ec4b7ca93a..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-language: java
-jdk: openjdk8
-install: echo "Over-riding default script for travis-ci"
-dist: trusty
-script:
- - jdk_switcher use openjdk8
- - mvn clean package -q '-Dtest=!%regex[io.opensaber.registry.client.*]' -DfailIfNoTests=false
- - bash <(curl -s https://codecov.io/bash)
-cache:
- directories:
- - "$HOME/.m2"
-notifications:
- slack: sunbird-ci:UegIg4Bf86V3HcXAB2uXNLGI
- on_success: never
- on_failure: always
- email:
- recipients:
- - manzarul.haque@tarento.com
- - amit.kumar@tarento.com
- - vinayab@ilimi.in
- on_success: never
- on_failure: always
-git:
- submodules: false
-before_install:
- - git submodule update --init --recursive --remote
diff --git a/Dockerfile b/Dockerfile
index 8522ff90f1..d639491e11 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,4 +12,5 @@ USER sunbird
COPY ./service/target/learning-service-1.0-SNAPSHOT-dist.zip /home/sunbird/learner/
RUN unzip /home/sunbird/learner/learning-service-1.0-SNAPSHOT-dist.zip -d /home/sunbird/learner/
WORKDIR /home/sunbird/learner/
-CMD java -XX:+PrintFlagsFinal $JAVA_OPTIONS -cp '/home/sunbird/learner/learning-service-1.0-SNAPSHOT/lib/*' play.core.server.ProdServerStart /home/sunbird/learner/learning-service-1.0-SNAPSHOT
+CMD java -XX:+PrintFlagsFinal $JAVA_OPTIONS -Dplay.server.http.idleTimeout=180s -cp '/home/sunbird/learner/learning-service-1.0-SNAPSHOT/lib/*' play.core.server.ProdServerStart /home/sunbird/learner/learning-service-1.0-SNAPSHOT
+
diff --git a/actors/sunbird-lms-mw b/actors/sunbird-lms-mw
deleted file mode 160000
index fd4f8c41bf..0000000000
--- a/actors/sunbird-lms-mw
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit fd4f8c41bfe25a3bdb83ad8849d47c50a4324fef
diff --git a/actors/sunbird-lms-mw/.gitignore b/actors/sunbird-lms-mw/.gitignore
new file mode 100644
index 0000000000..b5a3968b66
--- /dev/null
+++ b/actors/sunbird-lms-mw/.gitignore
@@ -0,0 +1,25 @@
+/target/
+project/project
+project/target
+target
+tmp
+.history
+dist
+/.idea
+/*.iml
+/out
+/.idea_modules
+/.classpath
+/.project
+/.settings
+/.target/
+/bin/
+/logs
+.settings
+.classpath
+.project
+**/*.iml
+**/.DS_Store
+actors/badge/logs
+dependency-reduced-pom.xml
+**/velocity.log
diff --git a/actors/sunbird-lms-mw/actors/badge/pom.xml b/actors/sunbird-lms-mw/actors/badge/pom.xml
new file mode 100644
index 0000000000..45b40c234c
--- /dev/null
+++ b/actors/sunbird-lms-mw/actors/badge/pom.xml
@@ -0,0 +1,82 @@
+
+
+ 4.0.0
+
+ org.sunbird
+ mw-actors
+ 1.0-SNAPSHOT
+ ../pom.xml
+
+ badge
+ Badging Infra
+
+ UTF-8
+
+
+
+ org.sunbird
+ actor-common
+ 1.0-SNAPSHOT
+
+
+ com.typesafe.akka
+ akka-testkit_2.11
+ 2.5.19
+ test
+
+
+
+ ${basedir}/src/main/java
+ ${basedir}/src/test/java
+
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.7.5.201505241946
+
+ ${basedir}/target/coverage-reports/jacoco-unit.exec
+ ${basedir}/target/coverage-reports/jacoco-unit.exec
+
+
+
+ jacoco-initialize
+
+ prepare-agent
+
+
+
+ jacoco-site
+ package
+
+ report
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 2.3.2
+
+ 1.8
+ 1.8
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.20
+
+
+
+ **/*Spec.java
+ **/*Test.java
+
+
+
+
+
+
diff --git a/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/BadgeOperations.java b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/BadgeOperations.java
new file mode 100644
index 0000000000..21057b11a4
--- /dev/null
+++ b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/BadgeOperations.java
@@ -0,0 +1,14 @@
+package org.sunbird.badge;
+
+/** @author Mahesh Kumar Gangula */
+public enum BadgeOperations {
+ assignBadgeMessage,
+ revokeBadgeMessage,
+ createBadgeIssuer,
+ createBadgeAssertion,
+ assignBadgeToUser,
+ revokeBadgeFromUser,
+ getBadgeIssuer,
+ getAllIssuer,
+ deleteIssuer
+}
diff --git a/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeAssertionActor.java b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeAssertionActor.java
new file mode 100644
index 0000000000..12ca197c41
--- /dev/null
+++ b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeAssertionActor.java
@@ -0,0 +1,126 @@
+/** */
+package org.sunbird.badge.actors;
+
+import java.io.IOException;
+import java.util.Map;
+import org.sunbird.actor.core.BaseActor;
+import org.sunbird.actor.router.ActorConfig;
+import org.sunbird.badge.BadgeOperations;
+import org.sunbird.badge.service.impl.BadgingFactory;
+import org.sunbird.badge.util.BadgeAssertionValidator;
+import org.sunbird.badge.util.BadgingUtil;
+import org.sunbird.common.models.response.Response;
+import org.sunbird.common.models.util.BadgingJsonKey;
+import org.sunbird.common.models.util.JsonKey;
+import org.sunbird.common.models.util.LoggerEnum;
+import org.sunbird.common.models.util.ProjectLogger;
+import org.sunbird.common.models.util.TelemetryEnvKey;
+import org.sunbird.common.request.Request;
+import org.sunbird.learner.util.Util;
+
+/** @author Manzarul */
+@ActorConfig(
+ tasks = {"createBadgeAssertion", "getBadgeAssertion", "getBadgeAssertionList", "revokeBadge"},
+ asyncTasks = {}
+)
+public class BadgeAssertionActor extends BaseActor {
+
+ @Override
+ public void onReceive(Request request) throws Throwable {
+ ProjectLogger.log("BadgeAssertionActor onReceive called", LoggerEnum.INFO.name());
+ String operation = request.getOperation();
+
+ Util.initializeContext(request, TelemetryEnvKey.BADGE_ASSERTION);
+
+ switch (operation) {
+ case "createBadgeAssertion":
+ createAssertion(request);
+ break;
+ case "getBadgeAssertion":
+ getAssertionDetails(request);
+ break;
+ case "getBadgeAssertionList":
+ getAssertionList(request);
+ break;
+ case "revokeBadge":
+ revokeAssertion(request);
+ break;
+ default:
+ onReceiveUnsupportedOperation("BadgeClassActor");
+ }
+ }
+
+ /**
+ * This method will call the badger server to create badge assertion.
+ *
+ * @param actorMessage Request
+ */
+ private void createAssertion(Request actorMessage) throws IOException {
+ ProjectLogger.log(
+ "BadgeAssertionActor:createAssertion: Call started ",
+ actorMessage.getRequest(),
+ LoggerEnum.INFO.name());
+ String recipientId = (String) actorMessage.getRequest().get(BadgingJsonKey.RECIPIENT_ID);
+ String objectType = (String) actorMessage.getRequest().get(BadgingJsonKey.RECIPIENT_TYPE);
+ String badgeId = (String) actorMessage.getRequest().get(BadgingJsonKey.BADGE_ID);
+ BadgeAssertionValidator.validateRootOrg(recipientId, objectType, badgeId);
+ Response result = BadgingFactory.getInstance().badgeAssertion(actorMessage);
+ ProjectLogger.log(
+ "BadgeAssertionActor:createAssertion: Assertion Response : " + result.getResult(),
+ LoggerEnum.INFO.name());
+ sender().tell(result, self());
+ Map map = BadgingUtil.createBadgeNotifierMap(result.getResult());
+ Request request = new Request();
+ ProjectLogger.log(
+ "BadgeAssertionActor:createAssertion: Notifying badge assertion for "
+ + objectType
+ + " with id: "
+ + recipientId,
+ actorMessage.getRequest(),
+ LoggerEnum.INFO.name());
+ map.put(JsonKey.OBJECT_TYPE, objectType);
+ map.put(JsonKey.ID, recipientId);
+ request.getRequest().putAll(map);
+ request.setOperation(BadgeOperations.assignBadgeMessage.name());
+ tellToAnother(request);
+ }
+
+ /**
+ * This method will get single assertion details based on issuerSlug, badgeClassSlug and
+ * assertionSlug
+ *
+ * @param request Request
+ */
+ private void getAssertionDetails(Request request) throws IOException {
+ Response result = BadgingFactory.getInstance().getAssertionDetails(request);
+ sender().tell(result, self());
+ }
+
+ /**
+ * This method will get single assertion details based on issuerSlug, badgeClassSlug and
+ * assertionSlug
+ *
+ * @param request Request
+ */
+ private void getAssertionList(Request request) throws IOException {
+ Response result = BadgingFactory.getInstance().getAssertionList(request);
+ sender().tell(result, self());
+ }
+
+ /**
+ * This method will make a call for revoking the badges.
+ *
+ * @param request Request
+ */
+ private void revokeAssertion(Request request) throws IOException {
+ Response result = BadgingFactory.getInstance().revokeAssertion(request);
+ sender().tell(result, self());
+ Map map = BadgingUtil.createRevokeBadgeNotifierMap(request.getRequest());
+ Request notificationReq = new Request();
+ map.put(JsonKey.OBJECT_TYPE, request.getRequest().get(BadgingJsonKey.RECIPIENT_TYPE));
+ map.put(JsonKey.ID, request.getRequest().get(BadgingJsonKey.RECIPIENT_ID));
+ notificationReq.getRequest().putAll(map);
+ notificationReq.setOperation(BadgeOperations.revokeBadgeMessage.name());
+ tellToAnother(notificationReq);
+ }
+}
diff --git a/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeClassActor.java b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeClassActor.java
new file mode 100644
index 0000000000..8d2d367149
--- /dev/null
+++ b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeClassActor.java
@@ -0,0 +1,151 @@
+package org.sunbird.badge.actors;
+
+import org.sunbird.actor.core.BaseActor;
+import org.sunbird.actor.router.ActorConfig;
+import org.sunbird.badge.service.BadgingService;
+import org.sunbird.badge.service.impl.BadgingFactory;
+import org.sunbird.common.exception.ProjectCommonException;
+import org.sunbird.common.models.response.Response;
+import org.sunbird.common.models.util.BadgingJsonKey;
+import org.sunbird.common.models.util.ProjectLogger;
+import org.sunbird.common.models.util.TelemetryEnvKey;
+import org.sunbird.common.request.Request;
+import org.sunbird.learner.util.Util;
+
+/**
+ * BadgeClassActor handles BadgeClass requests.
+ *
+ * @author B Vinaya Kumar
+ */
+@ActorConfig(
+ tasks = {"createBadgeClass", "getBadgeClass", "searchBadgeClass", "deleteBadgeClass"},
+ asyncTasks = {}
+)
+public class BadgeClassActor extends BaseActor {
+
+ private BadgingService badgingService;
+
+ public BadgeClassActor() {
+ this.badgingService = BadgingFactory.getInstance();
+ }
+
+ public BadgeClassActor(BadgingService badgingService) {
+ this.badgingService = badgingService;
+ }
+
+ @Override
+ public void onReceive(Request request) throws Throwable {
+ ProjectLogger.log("BadgeClassActor onReceive called");
+ String operation = request.getOperation();
+
+ Util.initializeContext(request, TelemetryEnvKey.BADGE_CLASS);
+
+ switch (operation) {
+ case "createBadgeClass":
+ createBadgeClass(request);
+ break;
+ case "getBadgeClass":
+ getBadgeClass(request);
+ break;
+ case "searchBadgeClass":
+ searchBadgeClass(request);
+ break;
+ case "deleteBadgeClass":
+ deleteBadgeClass(request);
+ break;
+ default:
+ onReceiveUnsupportedOperation("BadgeClassActor");
+ }
+ }
+
+ /**
+ * Creates a new badge class for a particular issuer.
+ *
+ * @param actorMessage Request message containing following request data: issuerId: The ID of the
+ * Issuer to be owner of the new Badge Class name: The name of the Badge Class description: A
+ * short description of the new Badge Class. image: An image to represent the Badge Class.
+ * criteria: Either a text string or a URL of a remotely hosted page describing the criteria
+ * rootOrgId: Root organisation ID type: Badge class type (user / content) subtype: Badge
+ * class subtype (e.g. award) roles: JSON array of roles (e.g. [
+ * "OFFICIAL_TEXTBOOK_BADGE_ISSUER" ])
+ * @return Return a promise for create badge class API result.
+ */
+ private void createBadgeClass(Request actorMessage) {
+ ProjectLogger.log("createBadgeClass called");
+
+ try {
+ Response response = badgingService.createBadgeClass(actorMessage);
+
+ sender().tell(response, self());
+ } catch (ProjectCommonException e) {
+ ProjectLogger.log("createBadgeClass: exception = ", e);
+
+ sender().tell(e, self());
+ }
+ }
+
+ /**
+ * Get details of requsted badge class.
+ *
+ * @param actorMessage Request message containing following request data: badgeId The ID of the
+ * Badge Class whose details to view
+ */
+ private void getBadgeClass(Request actorMessage) {
+ ProjectLogger.log("getBadgeClass called");
+
+ try {
+ Response response =
+ badgingService.getBadgeClassDetails(
+ (String) actorMessage.getRequest().get(BadgingJsonKey.BADGE_ID));
+
+ sender().tell(response, self());
+ } catch (ProjectCommonException e) {
+ ProjectLogger.log("getBadgeClass: exception = ", e);
+
+ sender().tell(e, self());
+ }
+ }
+
+ /**
+ * Get list of badge classes for given issuer(s) and matching given context.
+ *
+ * @param actorMessage Request message containing following request data issuerList: List of
+ * Issuer IDs whose badge classes are to be listed badgeList: List of badge IDs whose badge
+ * classes are to be listed rootOrgId: Root organisation ID type: Badge class type (user /
+ * content) subtype: Badge class subtype (e.g. award) roles: JSON array of roles (e.g. [
+ * "OFFICIAL_TEXTBOOK_BADGE_ISSUER" ])
+ */
+ private void searchBadgeClass(Request actorMessage) {
+ ProjectLogger.log("searchBadgeClass called");
+
+ try {
+ Response response = badgingService.searchBadgeClass(actorMessage);
+
+ sender().tell(response, self());
+ } catch (ProjectCommonException e) {
+ ProjectLogger.log("searchBadgeClass: exception = ", e);
+
+ sender().tell(e, self());
+ }
+ }
+
+ /**
+ * Delete a badge class that has never been issued.
+ *
+ * @param actorMessage Request message containing following request data: badgeId The ID of the
+ * Badge Class to delete
+ */
+ private void deleteBadgeClass(Request actorMessage) {
+ ProjectLogger.log("deleteBadgeClass called");
+
+ try {
+ Response response = badgingService.removeBadgeClass(actorMessage);
+
+ sender().tell(response, self());
+ } catch (ProjectCommonException e) {
+ ProjectLogger.log("deleteBadgeClass: exception = ", e);
+
+ sender().tell(e, self());
+ }
+ }
+}
diff --git a/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeIssuerActor.java b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeIssuerActor.java
new file mode 100644
index 0000000000..9a176f4fb3
--- /dev/null
+++ b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeIssuerActor.java
@@ -0,0 +1,81 @@
+package org.sunbird.badge.actors;
+
+import java.io.IOException;
+import org.sunbird.actor.core.BaseActor;
+import org.sunbird.actor.router.ActorConfig;
+import org.sunbird.badge.service.BadgingService;
+import org.sunbird.badge.service.impl.BadgingFactory;
+import org.sunbird.common.models.response.Response;
+import org.sunbird.common.models.util.LoggerEnum;
+import org.sunbird.common.models.util.ProjectLogger;
+import org.sunbird.common.models.util.TelemetryEnvKey;
+import org.sunbird.common.request.Request;
+import org.sunbird.learner.util.Util;
+
+/** Created by arvind on 5/3/18. */
+@ActorConfig(
+ tasks = {"createBadgeIssuer", "getBadgeIssuer", "getAllIssuer", "deleteIssuer"},
+ asyncTasks = {}
+)
+public class BadgeIssuerActor extends BaseActor {
+
+ private BadgingService badgingService;
+
+ public BadgeIssuerActor() {
+ this.badgingService = BadgingFactory.getInstance();
+ }
+
+ public BadgeIssuerActor(BadgingService badgingService) {
+ this.badgingService = badgingService;
+ }
+
+ @Override
+ public void onReceive(Request request) throws Throwable {
+ ProjectLogger.log("BadgeIssuerActor onReceive called", LoggerEnum.INFO.name());
+ String operation = request.getOperation();
+
+ Util.initializeContext(request, TelemetryEnvKey.BADGE);
+
+ switch (operation) {
+ case "createBadgeIssuer":
+ createBadgeIssuer(request);
+ break;
+ case "getBadgeIssuer":
+ getBadgeIssuer(request);
+ break;
+ case "getAllIssuer":
+ getAllIssuer(request);
+ break;
+ case "deleteIssuer":
+ deleteIssuer(request);
+ break;
+ default:
+ onReceiveUnsupportedOperation("BadgeIssuerActor");
+ }
+ }
+
+ /**
+ * Actor mathod to create the issuer of badge .
+ *
+ * @param actorMessage
+ */
+ private void createBadgeIssuer(Request actorMessage) throws IOException {
+ Response response = badgingService.createIssuer(actorMessage);
+ sender().tell(response, self());
+ }
+
+ private void getBadgeIssuer(Request actorMessage) throws IOException {
+ Response response = badgingService.getIssuerDetails(actorMessage);
+ sender().tell(response, self());
+ }
+
+ private void getAllIssuer(Request actorMessage) throws IOException {
+ Response response = badgingService.getIssuerList(actorMessage);
+ sender().tell(response, self());
+ }
+
+ private void deleteIssuer(Request request) throws IOException {
+ Response response = badgingService.deleteIssuer(request);
+ sender().tell(response, self());
+ }
+}
diff --git a/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeNotifier.java b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeNotifier.java
new file mode 100644
index 0000000000..7dd957de7d
--- /dev/null
+++ b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/BadgeNotifier.java
@@ -0,0 +1,86 @@
+package org.sunbird.badge.actors;
+
+import java.util.Arrays;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.sunbird.actor.core.BaseActor;
+import org.sunbird.actor.router.ActorConfig;
+import org.sunbird.badge.BadgeOperations;
+import org.sunbird.common.models.response.Response;
+import org.sunbird.common.models.response.ResponseParams;
+import org.sunbird.common.models.util.JsonKey;
+import org.sunbird.common.models.util.LoggerEnum;
+import org.sunbird.common.models.util.ProjectLogger;
+import org.sunbird.common.models.util.TelemetryEnvKey;
+import org.sunbird.common.request.Request;
+import org.sunbird.common.responsecode.ResponseCode;
+import org.sunbird.learner.util.Util;
+
+/** @author Mahesh Kumar Gangula */
+@ActorConfig(
+ tasks = {},
+ asyncTasks = {"assignBadgeMessage", "revokeBadgeMessage"}
+)
+public class BadgeNotifier extends BaseActor {
+
+ @Override
+ public void onReceive(Request request) throws Throwable {
+ Util.initializeContext(request, TelemetryEnvKey.USER);
+ List asyncTasks = Arrays.asList("assignBadgeMessage", "revokeBadgeMessage");
+ String operation = request.getOperation();
+ String objectType = (String) request.getRequest().get(JsonKey.OBJECT_TYPE);
+ ProjectLogger.log(
+ "Processing badge notification for " + operation,
+ request.getRequest(),
+ LoggerEnum.INFO.name());
+ Response response;
+ if (StringUtils.isNotBlank(operation) && asyncTasks.contains(operation)) {
+ response = processBadge(operation, objectType, request);
+ sender().tell(response, self());
+ } else {
+ onReceiveUnsupportedMessage(request.getOperation());
+ }
+ }
+
+ private Response processBadge(String operation, String objectType, Request request)
+ throws Exception {
+ Response response;
+ String INVALID_BADGE_NOTIFICATION_REQUEST = "INVALID_BADGE_NOTIFICATION_REQUEST";
+ if (StringUtils.isBlank(objectType)) {
+ response = invalidObjectType(INVALID_BADGE_NOTIFICATION_REQUEST, objectType);
+ } else {
+ String caseVal = objectType.toUpperCase() + ":" + operation.toUpperCase();
+ switch (caseVal) {
+ case "USER:ASSIGNBADGEMESSAGE":
+ request.setOperation(BadgeOperations.assignBadgeToUser.name());
+ response = notifyUser(request);
+ break;
+ case "USER:REVOKEBADGEMESSAGE":
+ request.setOperation(BadgeOperations.revokeBadgeFromUser.name());
+ response = notifyUser(request);
+ break;
+ default:
+ response = invalidObjectType(INVALID_BADGE_NOTIFICATION_REQUEST, objectType);
+ break;
+ }
+ }
+ return response;
+ }
+
+ private Response notifyUser(Request request) {
+ tellToAnother(request);
+ Response response = new Response();
+ response.setResponseCode(ResponseCode.success);
+ return response;
+ }
+
+ private Response invalidObjectType(String error, String objectType) {
+ Response response = new Response();
+ response.setResponseCode(ResponseCode.CLIENT_ERROR);
+ ResponseParams params = new ResponseParams();
+ params.setErrmsg("ObjectType is invalid to assign/revoke badge: " + objectType);
+ params.setErr(error);
+ response.setParams(params);
+ return response;
+ }
+}
diff --git a/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/UserBadgeAssertion.java b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/UserBadgeAssertion.java
new file mode 100644
index 0000000000..43fd15cb4b
--- /dev/null
+++ b/actors/sunbird-lms-mw/actors/badge/src/main/java/org/sunbird/badge/actors/UserBadgeAssertion.java
@@ -0,0 +1,156 @@
+package org.sunbird.badge.actors;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.sunbird.actor.core.BaseActor;
+import org.sunbird.actor.router.ActorConfig;
+import org.sunbird.badge.BadgeOperations;
+import org.sunbird.cassandra.CassandraOperation;
+import org.sunbird.common.ElasticSearchHelper;
+import org.sunbird.common.factory.EsClientFactory;
+import org.sunbird.common.models.response.Response;
+import org.sunbird.common.models.util.*;
+import org.sunbird.common.request.Request;
+import org.sunbird.helper.ServiceFactory;
+import org.sunbird.learner.util.Util;
+import org.sunbird.learner.util.Util.DbInfo;
+import org.sunbird.telemetry.util.TelemetryUtil;
+import scala.concurrent.Future;
+
+@ActorConfig(
+ tasks = {},
+ asyncTasks = {"assignBadgeToUser", "revokeBadgeFromUser"}
+)
+public class UserBadgeAssertion extends BaseActor {
+
+ @Override
+ public void onReceive(Request request) {
+ Util.initializeContext(request, TelemetryEnvKey.USER);
+ String operation = request.getOperation();
+ if (BadgeOperations.assignBadgeToUser.name().equalsIgnoreCase(operation)) {
+ addBadgeData(request);
+ } else if (BadgeOperations.revokeBadgeFromUser.name().equalsIgnoreCase(operation)) {
+ revokeBadgeData(request);
+ }
+ }
+
+ private void revokeBadgeData(Request request) {
+ // request came to revoke the badge from user
+ DbInfo dbInfo = Util.dbInfoMap.get(BadgingJsonKey.USER_BADGE_ASSERTION_DB);
+ Map badge = getBadgeAssertion(request);
+ CassandraOperation cassandraOperation = ServiceFactory.getInstance();
+ cassandraOperation.deleteRecord(
+ dbInfo.getKeySpace(),
+ dbInfo.getTableName(),
+ (String) badge.get(BadgingJsonKey.ASSERTION_ID));
+ updateUserBadgeDataToES(badge);
+ tellToSender(request, badge);
+ }
+
+ private void addBadgeData(Request request) {
+ // request came to assign the badge from user
+ DbInfo dbInfo = Util.dbInfoMap.get(BadgingJsonKey.USER_BADGE_ASSERTION_DB);
+ Map badge = getBadgeAssertion(request);
+ CassandraOperation cassandraOperation = ServiceFactory.getInstance();
+ cassandraOperation.insertRecord(dbInfo.getKeySpace(), dbInfo.getTableName(), badge);
+ updateUserBadgeDataToES(badge);
+ tellToSender(request, badge);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void updateUserBadgeDataToES(Map map) {
+ Future