Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
6bd4a81
refactor: move telemetry utilities and DTOs to a new `sunbird-event-u…
chethann007 Jan 28, 2026
4400f03
refactor(core): rewrite and migrate kafka utilities to sunbird-event-…
chethann007 Feb 2, 2026
8330791
refactor(core): remove legacy platform-core and auth-verifier components
chethann007 Feb 2, 2026
57785e9
feat(core): initialize sunbird-platform-common module
chethann007 Feb 2, 2026
73fd0cc
build(core): update parent pom and register sunbird-platform-common
chethann007 Feb 2, 2026
33523c9
refactor(cassandra): migrate dependencies to sunbird-platform-common
chethann007 Feb 2, 2026
8c6b09f
refactor(es): migrate elasticsearch utilities to sunbird-platform-common
chethann007 Feb 2, 2026
e3c5cd0
refactor(telemetry): update telemetry util imports to platform-common
chethann007 Feb 2, 2026
3fe80dc
refactor(course-actors): update course-actors imports to sunbird-plat…
chethann007 Feb 2, 2026
9aacf6e
refactor(course-actors-common): migrate utilities and actors to platf…
chethann007 Feb 2, 2026
64d12d4
refactor(enrolment-actor): migrate scala actors to platform-common
chethann007 Feb 2, 2026
03fda7c
refactor(cache): update cache utilities to platform-common
chethann007 Feb 2, 2026
7e55129
build(platform-core): remove legacy modules from parent pom
chethann007 Feb 2, 2026
f8026e1
refactor(actor-core): migrate platform actor-core to platform-common
chethann007 Feb 2, 2026
6c8d9ea
refactor(actor-util): migrate platform actor-util to platform-common
chethann007 Feb 2, 2026
01b57c1
build(sunbird-commons): update dependencies to platform-common
chethann007 Feb 2, 2026
e674098
refactor(service): migrate play application to sunbird-platform-common
chethann007 Feb 2, 2026
a56bf99
refactor: merge event-utils into platform-common and fix package errors
chethann007 Feb 3, 2026
5db7298
build: Upgrade several dependencies, including Guava, JAX-RS, and Res…
chethann007 Feb 4, 2026
46eb68b
refactor: update sunbird-event-utils dependency to sunbird-platform-c…
chethann007 Feb 4, 2026
d499f01
Merge remote-tracking branch 'origin/develop' into platform_common
chethann007 Feb 6, 2026
1d3436f
refactor: fix compilation errors in assessment-aggregator and enrolme…
chethann007 Feb 6, 2026
f1b9017
refactor: move @Inject annotation to the auxiliary constructor in `As…
chethann007 Feb 6, 2026
7f8ee4c
Merge remote-tracking branch 'origin/develop' into platform_common
chethann007 Feb 10, 2026
b41ca93
refactor: update package imports to point to `sunbird-platform-common`
chethann007 Feb 12, 2026
e5b6839
fix: correct default value of contentReadPath
chethann007 Feb 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 0 additions & 5 deletions activity-aggregator/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,6 @@
<artifactId>actor-core</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.sunbird</groupId>
<artifactId>common-util</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.sunbird</groupId>
<artifactId>cache-utils</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ import org.sunbird.activity.domain.{CollectionProgress, ContentStatus, Telemetry
import org.sunbird.activity.util.{ActivityAggregateUtil, CertificateUtil, ContentSearchUtil, DeDupUtil, RedisUtil}
import org.sunbird.cache.util.RedisCacheUtil
import org.sunbird.cassandra.CassandraOperation
import org.sunbird.common.exception.ProjectCommonException
import org.sunbird.common.models.util.{JsonKey, LoggerUtil, ProjectUtil}
import org.sunbird.common.request.{Request, RequestContext}
import org.sunbird.common.responsecode.ResponseCode
import org.sunbird.exception.ProjectCommonException
import org.sunbird.keys.JsonKey
import org.sunbird.logging.LoggerUtil
import org.sunbird.common.ProjectUtil
import org.sunbird.request.{Request, RequestContext}
import org.sunbird.response.ResponseCode
import org.sunbird.enrolments.BaseEnrolmentActor
import org.sunbird.helper.ServiceFactory
import org.sunbird.kafka.client.KafkaClient
import org.sunbird.kafka.KafkaClient
import org.sunbird.learner.util.Util

import java.util
Expand Down Expand Up @@ -223,7 +225,7 @@ class ActivityAggregatorActor @Inject()(implicit val cacheUtil: RedisCacheUtil)
cassandraOperation.batchUpdate(consumptionDBInfo.getKeySpace, "user_content_consumption", queries, requestContext)
logger.info(requestContext, s"updateContentConsumption: Batch update completed successfully")
} else {
logger.warn(requestContext, s"updateContentConsumption: No queries to execute")
logger.warn(requestContext, s"updateContentConsumption: No queries to execute", null)
}
}

Expand All @@ -240,7 +242,7 @@ class ActivityAggregatorActor @Inject()(implicit val cacheUtil: RedisCacheUtil)
logger.info(requestContext, s"computeCourseAggregations: Course aggregation computed successfully")
List(courseAggOpt.get)
} else {
logger.warn(requestContext, s"computeCourseAggregations: No course aggregation computed")
logger.warn(requestContext, s"computeCourseAggregations: No course aggregation computed", null)
List()
}

Expand Down Expand Up @@ -281,7 +283,7 @@ class ActivityAggregatorActor @Inject()(implicit val cacheUtil: RedisCacheUtil)
cassandraOperation.batchUpdate(activityAggDBInfo.getKeySpace, activityAggDBInfo.getTableName, aggQueries, requestContext)
logger.info(requestContext, s"updateActivityAggregates: Batch update completed successfully")
} else {
logger.warn(requestContext, s"updateActivityAggregates: No queries to execute")
logger.warn(requestContext, s"updateActivityAggregates: No queries to execute", null)
}
}

Expand Down Expand Up @@ -393,7 +395,7 @@ class ActivityAggregatorActor @Inject()(implicit val cacheUtil: RedisCacheUtil)
logger.info(requestContext, s"getEnrolmentStatus: No enrolment found, returning status 0")
}
} else {
logger.warn(requestContext, s"getEnrolmentStatus: Null response from Cassandra")
logger.warn(requestContext, s"getEnrolmentStatus: Null response from Cassandra", null)
}

0
Expand Down Expand Up @@ -432,7 +434,7 @@ class ActivityAggregatorActor @Inject()(implicit val cacheUtil: RedisCacheUtil)

Some(contentId -> ContentStatus(contentId, status, completedCount, viewCount, progress, lastAccessTime, lastCompletedTime, lastUpdatedTime, fromInput = false))
} else {
logger.warn(requestContext, s"getContentStatusFromDB: Skipping row with missing contentId. Keys: ${row.keySet()}")
logger.warn(requestContext, s"getContentStatusFromDB: Skipping row with missing contentId. Keys: ${row.keySet()}", null)
None
}
}).toMap
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package org.sunbird.activity.util
import org.apache.commons.collections4.CollectionUtils
import org.apache.commons.lang3.StringUtils
import org.sunbird.activity.domain._
import org.sunbird.common.models.util.{JsonKey, LoggerUtil, ProjectUtil}
import org.sunbird.common.request.RequestContext
import org.sunbird.keys.JsonKey
import org.sunbird.logging.LoggerUtil
import org.sunbird.common.ProjectUtil
import org.sunbird.request.RequestContext

import java.util
import java.util.Date
Expand Down Expand Up @@ -138,7 +140,7 @@ class ActivityAggregateUtil {
logger.info(requestContext, s"computeCourseActivityAgg: courseId: $courseId, userId: $userId, leafNodes: ${leafNodes.size}, optionalNodes: ${optionalNodes.size}")

if (leafNodes.isEmpty) {
logger.warn(requestContext, s"computeCourseActivityAgg: Leaf nodes are not available for courseId: $courseId")
logger.warn(requestContext, s"computeCourseActivityAgg: Leaf nodes are not available for courseId: $courseId", null)
None
} else {
val updatedLeafNodes = leafNodes.diff(optionalNodes)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package org.sunbird.activity.util

import com.fasterxml.jackson.databind.ObjectMapper
import org.sunbird.common.models.util.ProjectUtil
import org.sunbird.common.request.RequestContext
import org.sunbird.kafka.client.KafkaClient
import org.sunbird.common.ProjectUtil
import org.sunbird.request.RequestContext
import org.sunbird.kafka.KafkaClient

import java.util.UUID

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package org.sunbird.activity.util

import com.fasterxml.jackson.databind.ObjectMapper
import org.sunbird.common.models.util.{HttpUtil, ProjectUtil}
import org.sunbird.common.request.RequestContext
import org.sunbird.http.HttpUtil
import org.sunbird.common.ProjectUtil
import org.sunbird.request.RequestContext

import java.util
import scala.collection.JavaConverters._
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.sunbird.activity.util

import org.sunbird.cache.util.RedisCacheUtil
import org.sunbird.common.models.util.ProjectUtil
import org.sunbird.common.request.RequestContext
import org.sunbird.common.ProjectUtil
import org.sunbird.request.RequestContext

import java.security.MessageDigest

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ package org.sunbird.activity.util

import org.apache.commons.collections.CollectionUtils
import org.sunbird.cache.util.RedisCacheUtil
import org.sunbird.common.models.util.{LoggerUtil, ProjectUtil}
import org.sunbird.common.request.RequestContext
import org.sunbird.logging.LoggerUtil
import org.sunbird.common.ProjectUtil
import org.sunbird.request.RequestContext

import scala.collection.JavaConverters._

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import org.sunbird.activity.util.{CertificateUtil, ContentSearchUtil, DeDupUtil,
import org.sunbird.activity.domain.{CollectionProgress, TelemetryEvent}
import org.sunbird.cache.util.RedisCacheUtil
import org.sunbird.cassandra.CassandraOperation
import org.sunbird.common.models.response.Response
import org.sunbird.common.models.util.JsonKey
import org.sunbird.common.request.{Request, RequestContext}
import org.sunbird.response.Response
import org.sunbird.keys.JsonKey
import org.sunbird.request.{Request, RequestContext}

import java.util
import scala.concurrent.duration._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package org.sunbird.activity.util
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.sunbird.activity.domain.{ContentStatus, UserContentConsumption}
import org.sunbird.common.request.RequestContext
import org.sunbird.request.RequestContext

import java.util
import java.util.Date
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@ package org.sunbird.assessment.actor
import org.sunbird.actor.core.BaseActor
import javax.inject.Inject
import org.apache.pekko.actor.Props
import org.sunbird.common.exception.ProjectCommonException
import org.sunbird.common.request.{Request, RequestContext}
import org.sunbird.common.responsecode.ResponseCode
import org.sunbird.exception.ProjectCommonException
import org.sunbird.request.{Request, RequestContext}
import org.sunbird.response.ResponseCode
import org.sunbird.assessment.models._
import org.sunbird.assessment.service._
import org.sunbird.assessment.util.AssessmentParser
import org.sunbird.common.models.util.{JsonKey, LoggerUtil, ProjectUtil}
import org.sunbird.keys.JsonKey
import org.sunbird.logging.LoggerUtil
import org.sunbird.common.ProjectUtil
import scala.collection.JavaConverters._
import org.apache.commons.lang3.StringUtils

class AssessmentAggregatorActor @Inject()(_redisService: Option[RedisService],_contentService: Option[ContentService],_cassandraService: Option[CassandraService],_kafkaService: Option[KafkaService]) extends BaseActor {
class AssessmentAggregatorActor(_redisService: Option[RedisService],_contentService: Option[ContentService],_cassandraService: Option[CassandraService],_kafkaService: Option[KafkaService]) extends BaseActor {

@Inject()
def this() = this(None, None, None, None)

private lazy val redisService = _redisService.getOrElse(new RedisService())
Expand Down Expand Up @@ -86,7 +89,7 @@ class AssessmentAggregatorActor @Inject()(_redisService: Option[RedisService],_c
if (request.events.nonEmpty) return List(request)
val existing = fetchStoredAssessments(request, context)
if (existing.isEmpty) {
logger.warn(context, s"Sync Flow: No stored events found for userId=${request.userId}, contentId=${request.contentId}, attemptId=${request.attemptId}")
logger.warn(context, s"Sync Flow: No stored events found for userId=${request.userId}, contentId=${request.contentId}, attemptId=${request.attemptId}", null)
return List(request)
}
logger.info(context, s"Sync Flow: Recovered ${existing.size} attempt(s) for userId=${request.userId}, contentId=${request.contentId}")
Expand Down Expand Up @@ -125,7 +128,7 @@ class AssessmentAggregatorActor @Inject()(_redisService: Option[RedisService],_c
if (skipMissing) {
val totalQuestions = metadata.totalQuestions
if (totalQuestions > 0 && uniqueEvents.size > totalQuestions) {
logger.warn(context, s"Skipping assessment ${req.attemptId}: unique events (${uniqueEvents.size}) exceed total questions ($totalQuestions)")
logger.warn(context, s"Skipping assessment ${req.attemptId}: unique events (${uniqueEvents.size}) exceed total questions ($totalQuestions)", null)
return
}
}
Expand Down Expand Up @@ -220,7 +223,7 @@ class AssessmentAggregatorActor @Inject()(_redisService: Option[RedisService],_c

private def getD(m: java.util.Map[String, AnyRef], k: String): Double = Option(m.get(k)).map(_.asInstanceOf[Number].doubleValue()).getOrElse(0.0)

private def createSuccess(aid: String) = { val r = new org.sunbird.common.models.response.Response(); r.put("response", "SUCCESS"); r.put("attemptId", aid); r }
private def createSuccess(aid: String) = { val r = new org.sunbird.response.Response(); r.put("response", "SUCCESS"); r.put("attemptId", aid); r }
private def createErrorResponse(code: String, msg: String, responseCode: Int): ProjectCommonException = new ProjectCommonException(code, msg, responseCode)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package org.sunbird.assessment.service
import org.sunbird.assessment.models._
import org.sunbird.common.models.util.ProjectUtil
import org.sunbird.common.ProjectUtil
import java.text.DecimalFormat

class AssessmentService(redisService: RedisService, contentService: ContentService) {

private val decimalFormat = new DecimalFormat("0.0#")
private val aggType = Option(org.sunbird.common.models.util.ProjectUtil.getConfigValue("user_activity_agg_type")).getOrElse("assessment")
private val aggType = Option(org.sunbird.common.ProjectUtil.getConfigValue("user_activity_agg_type")).getOrElse("assessment")

def getUniqueQuestions(events: List[AssessmentEvent]): List[AssessmentEvent] = {
events.sortBy(_.timestamp)(Ordering[Long].reverse).groupBy(_.questionId).values.map(_.head).toList
Expand All @@ -24,7 +24,7 @@ class AssessmentService(redisService: RedisService, contentService: ContentServi
/**
* Fetches content metadata once by combining Redis and Content API checks.
*/
def getMetadata(courseId: String, contentId: String, context: org.sunbird.common.request.RequestContext): ContentMetadata = {
def getMetadata(courseId: String, contentId: String, context: org.sunbird.request.RequestContext): ContentMetadata = {
val isValidInCache = redisService.isValidContent(courseId, contentId)
val cachedCount = redisService.getTotalQuestionsCount(contentId)
if (isValidInCache && cachedCount.isDefined) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package org.sunbird.assessment.service
import org.sunbird.cassandra.CassandraOperation
import org.sunbird.helper.ServiceFactory
import org.sunbird.common.request.RequestContext
import org.sunbird.request.RequestContext
import org.sunbird.assessment.models._
import org.sunbird.common.models.util.ProjectUtil
import org.sunbird.common.ProjectUtil
import scala.collection.JavaConverters._
import com.datastax.driver.core.{UserType, UDTValue}
import org.slf4j.LoggerFactory
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package org.sunbird.assessment.service

import org.sunbird.common.models.util.{HttpUtil, ProjectUtil, JsonKey, LoggerUtil}
import org.sunbird.common.request.RequestContext
import org.sunbird.http.HttpUtil
import org.sunbird.common.ProjectUtil
import org.sunbird.keys.JsonKey
import org.sunbird.logging.LoggerUtil
import org.sunbird.request.RequestContext
import org.apache.commons.lang3.StringUtils
import scala.collection.JavaConverters._

Expand All @@ -19,7 +22,7 @@ class ContentService(http: Option[HttpUtilWrapper] = None) {
private val logger = new LoggerUtil(classOf[ContentService])
private val httpUtil = http.getOrElse(DefaultHttpUtilWrapper)
private val baseUrl = Option(ProjectUtil.getConfigValue("sunbird_api_base_url")).filter(StringUtils.isNotBlank).getOrElse("http://localhost:9000")
private val contentReadPath = Option(ProjectUtil.getConfigValue("sunbird_content_read_api_path")).filter(StringUtils.isNotBlank).getOrElse("/content/v1/read/")
private val contentReadPath = Option(ProjectUtil.getConfigValue("sunbird_content_read_api_path")).filter(StringUtils.isNotBlank).getOrElse("/v1/content/read/")

def fetchMetadata(contentId: String, context: RequestContext): ContentMetadata = {
val url = s"$baseUrl$contentReadPath$contentId"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.sunbird.assessment.service

import org.sunbird.kafka.client.KafkaClient
import org.sunbird.kafka.KafkaClient

trait KafkaClientWrapper {
def send(event: String, topic: String): Unit
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.sunbird.assessment.service

import org.sunbird.kafka.client.KafkaClient
import org.sunbird.common.models.util.ProjectUtil
import org.sunbird.kafka.KafkaClient
import org.sunbird.common.ProjectUtil
import org.sunbird.assessment.models.AssessmentRequest
import com.fasterxml.jackson.databind.ObjectMapper
import org.slf4j.LoggerFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.sunbird.assessment.util
import org.sunbird.assessment.models.AssessmentEvent
import scala.collection.JavaConverters._
import com.google.gson.Gson
import org.sunbird.keys.JsonKey

object AssessmentParser {
private val gson = new Gson()
Expand All @@ -29,7 +30,7 @@ object AssessmentParser {
val resvalues = getListValues(m.getOrDefault("resvalues", new java.util.ArrayList()).asInstanceOf[java.util.List[java.util.Map[String, AnyRef]]])
val params = getListValues(m.getOrDefault("params", new java.util.ArrayList()).asInstanceOf[java.util.List[java.util.Map[String, AnyRef]]])
AssessmentEvent(
Option(m.get("questionId")).getOrElse(m.getOrDefault(org.sunbird.common.models.util.JsonKey.IDENTIFIER, "")).toString,
Option(m.get("questionId")).getOrElse(m.getOrDefault(JsonKey.IDENTIFIER, "")).toString,
getD(m, "score"),
getD(m, "maxScore"),
getD(m, "duration"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,17 @@ import org.mockito.MockitoSugar
import org.scalatest.BeforeAndAfterAll
import org.scalatest.flatspec.AnyFlatSpecLike
import org.scalatest.matchers.should.Matchers
import org.sunbird.common.request.{Request, RequestContext}
import org.sunbird.request.{Request, RequestContext}
import org.sunbird.assessment.models._
import org.sunbird.common.models.util.{JsonKey, PropertiesCache}
import org.sunbird.common.exception.ProjectCommonException
import org.sunbird.common.models.response.Response
import org.sunbird.keys.JsonKey
import org.sunbird.common.PropertiesCache
import org.sunbird.exception.ProjectCommonException
import org.sunbird.response.Response
import java.util.HashMap
import scala.collection.JavaConverters._
import scala.concurrent.duration._
import org.sunbird.assessment.service.{CassandraService, ContentMetadata, ContentService, KafkaService, RedisService}
import org.sunbird.common.responsecode.ResponseCode
import org.sunbird.response.ResponseCode

class AssessmentAggregatorActorSpec extends TestKit(ActorSystem("AssessmentAggregatorActorSpec"))
with ImplicitSender with AnyFlatSpecLike with Matchers with BeforeAndAfterAll with MockitoSugar {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import org.mockito.MockitoSugar
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.sunbird.assessment.models._
import org.sunbird.common.models.util.PropertiesCache
import org.sunbird.common.request.RequestContext
import org.sunbird.common.PropertiesCache
import org.sunbird.request.RequestContext

class AssessmentServiceSpec extends AnyFlatSpec with Matchers with MockitoSugar {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import org.mockito.MockitoSugar
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.sunbird.cassandra.CassandraOperation
import org.sunbird.common.models.response.Response
import org.sunbird.common.request.RequestContext
import org.sunbird.response.Response
import org.sunbird.request.RequestContext
import org.sunbird.assessment.models._
import java.util.{ArrayList, HashMap, Map}
import scala.collection.JavaConverters._
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import org.mockito.ArgumentMatchers._
import org.mockito.MockitoSugar
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.sunbird.common.request.RequestContext
import org.sunbird.request.RequestContext

class ContentServiceSpec extends AnyFlatSpec with Matchers with MockitoSugar {

Expand Down
Loading