Skip to content

Commit

Permalink
Refactor all references for activity-report renaming to learning-dash…
Browse files Browse the repository at this point in the history
…board
  • Loading branch information
gustavotrott committed Aug 25, 2021
1 parent 241ab5f commit cd15f17
Show file tree
Hide file tree
Showing 31 changed files with 174 additions and 152 deletions.
12 changes: 6 additions & 6 deletions akka-bbb-apps/src/main/scala/org/bigbluebutton/Boot.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import org.bigbluebutton.core2.AnalyticsActor
import org.bigbluebutton.core2.FromAkkaAppsMsgSenderActor
import org.bigbluebutton.endpoint.redis.AppsRedisSubscriberActor
import org.bigbluebutton.endpoint.redis.RedisRecorderActor
import org.bigbluebutton.endpoint.redis.ActivityTrackerActor
import org.bigbluebutton.endpoint.redis.LearningDashboardActor
import org.bigbluebutton.common2.bus.IncomingJsonMessageBus
import org.bigbluebutton.service.{ HealthzService, MeetingInfoActor, MeetingInfoService }

Expand Down Expand Up @@ -59,9 +59,9 @@ object Boot extends App with SystemConfiguration {
"redisRecorderActor"
)

val activityTrackerActor = system.actorOf(
ActivityTrackerActor.props(system, outGW),
"activityTrackerActor"
val learningDashboardActor = system.actorOf(
LearningDashboardActor.props(system, outGW),
"LearningDashboardActor"
)

recordingEventBus.subscribe(redisRecorderActor, outMessageChannel)
Expand All @@ -76,8 +76,8 @@ object Boot extends App with SystemConfiguration {
outBus2.subscribe(analyticsActorRef, outBbbMsgMsgChannel)
bbbMsgBus.subscribe(analyticsActorRef, analyticsChannel)

outBus2.subscribe(activityTrackerActor, outBbbMsgMsgChannel)
bbbMsgBus.subscribe(activityTrackerActor, analyticsChannel)
outBus2.subscribe(learningDashboardActor, outBbbMsgMsgChannel)
bbbMsgBus.subscribe(learningDashboardActor, analyticsChannel)

val bbbActor = system.actorOf(BigBlueButtonActor.props(system, eventBus, bbbMsgBus, outGW, healthzService), "bigbluebutton-actor")
eventBus.subscribe(bbbActor, meetingManagerChannel)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -545,12 +545,12 @@ object MsgBuilder {
BbbCommonEnvCoreMsg(envelope, event)
}

def buildActivityReportEvtMsg(meetingId: String, activityJson: String): BbbCommonEnvCoreMsg = {
def buildLearningDashboardEvtMsg(meetingId: String, activityJson: String): BbbCommonEnvCoreMsg = {
val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka")
val envelope = BbbCoreEnvelope(ActivityReportEvtMsg.NAME, routing)
val body = ActivityReportEvtMsgBody(activityJson)
val header = BbbCoreHeaderWithMeetingId(ActivityReportEvtMsg.NAME, meetingId)
val event = ActivityReportEvtMsg(header, body)
val envelope = BbbCoreEnvelope(LearningDashboardEvtMsg.NAME, routing)
val body = LearningDashboardEvtMsgBody(activityJson)
val header = BbbCoreHeaderWithMeetingId(LearningDashboardEvtMsg.NAME, meetingId)
val event = LearningDashboardEvtMsg(header, body)

BbbCommonEnvCoreMsg(envelope, event)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@ import ExecutionContext.Implicits.global

case object SendPeriodicReport

case class MeetingActivityTracker(
case class Meeting(
intId: String,
extId: String,
name: String,
activityReportAccessToken: String,
users: Map[String, UserActivityTracker] = Map(),
learningDashboardAccessToken: String,
users: Map[String, User] = Map(),
polls: Map[String, Poll] = Map(),
screenshares: Vector[Screenshare] = Vector(),
createdOn: Long = System.currentTimeMillis(),
endedOn: Long = 0,
)

case class UserActivityTracker(
case class User(
intId: String,
extId: String,
name: String,
Expand Down Expand Up @@ -73,24 +73,24 @@ case class Screenshare(
)


object ActivityTrackerActor {
object LearningDashboardActor {
def props(
system: ActorSystem,
outGW: OutMessageGateway,
): Props =
Props(
classOf[ActivityTrackerActor],
classOf[LearningDashboardActor],
system,
outGW
)
}

class ActivityTrackerActor(
class LearningDashboardActor(
system: ActorSystem,
val outGW: OutMessageGateway,
) extends Actor with ActorLogging {

private var meetings: Map[String, MeetingActivityTracker] = Map()
private var meetings: Map[String, Meeting] = Map()
private var meetingsLastJsonHash : Map[String,String] = Map()

system.scheduler.schedule(10.seconds, 10.seconds, self, SendPeriodicReport)
Expand Down Expand Up @@ -155,8 +155,8 @@ class ActivityTrackerActor(
for {
meeting <- meetings.values.find(m => m.intId == msg.header.meetingId)
} yield {
val user: UserActivityTracker = meeting.users.values.find(u => u.intId == msg.body.intId).getOrElse({
UserActivityTracker(
val user: User = meeting.users.values.find(u => u.intId == msg.body.intId).getOrElse({
User(
msg.body.intId, msg.body.extId, msg.body.name, (msg.body.role == Roles.MODERATOR_ROLE)
)
})
Expand Down Expand Up @@ -235,8 +235,8 @@ class ActivityTrackerActor(
for {
meeting <- meetings.values.find(m => m.intId == msg.header.meetingId)
} yield {
val user: UserActivityTracker = meeting.users.values.find(u => u.intId == msg.body.intId).getOrElse({
UserActivityTracker(
val user: User = meeting.users.values.find(u => u.intId == msg.body.intId).getOrElse({
User(
msg.body.intId, msg.body.callerNum, msg.body.callerName, false, true
)
})
Expand Down Expand Up @@ -286,7 +286,7 @@ class ActivityTrackerActor(
}
}

private def endUserTalk(meeting: MeetingActivityTracker, user: UserActivityTracker): Unit = {
private def endUserTalk(meeting: Meeting, user: User): Unit = {
if(user.talk.lastTalkStartedOn > 0) {
val updatedUser = user.copy(
talk = user.talk.copy(
Expand Down Expand Up @@ -354,19 +354,19 @@ class ActivityTrackerActor(
}

private def handleCreateMeetingReqMsg(msg: CreateMeetingReqMsg): Unit = {
if(msg.body.props.meetingProp.activityReportTracking) {
val newMeeting = MeetingActivityTracker(
if(msg.body.props.meetingProp.learningDashboardEnabled) {
val newMeeting = Meeting(
msg.body.props.meetingProp.intId,
msg.body.props.meetingProp.extId,
msg.body.props.meetingProp.name,
msg.body.props.password.activityReportAccessToken,
msg.body.props.password.learningDashboardAccessToken,
)

meetings += (newMeeting.intId -> newMeeting)

log.info("ActivityTracker created for meeting {}.",msg.body.props.meetingProp.intId)
log.info(" created for meeting {}.",msg.body.props.meetingProp.intId)
} else {
log.info("ActivityTracker disabled for meeting {}.",msg.body.props.meetingProp.intId)
log.info(" disabled for meeting {}.",msg.body.props.meetingProp.intId)
}
}

Expand Down Expand Up @@ -404,7 +404,7 @@ class ActivityTrackerActor(
sendReport(updatedMeeting)

meetings = meetings.-(updatedMeeting.intId)
log.info("ActivityTracker removed for meeting {}.",updatedMeeting.intId)
log.info(" removed for meeting {}.",updatedMeeting.intId)
}
}

Expand All @@ -414,14 +414,14 @@ class ActivityTrackerActor(
})
}

private def sendReport(meeting : MeetingActivityTracker): Unit = {
private def sendReport(meeting : Meeting): Unit = {
val activityJson: String = JsonUtil.toJson(meeting)

//Avoid send repeated activity jsons
val activityJsonHash : String = MessageDigest.getInstance("MD5").digest(activityJson.getBytes).mkString
if(!meetingsLastJsonHash.contains(meeting.intId) || meetingsLastJsonHash.get(meeting.intId).getOrElse("") != activityJsonHash) {

val event = MsgBuilder.buildActivityReportEvtMsg(meeting.intId, activityJson)
val event = MsgBuilder.buildLearningDashboardEvtMsg(meeting.intId, activityJson)
outGW.send(event)

meetingsLastJsonHash += (meeting.intId -> activityJsonHash)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ trait AppsTestFixtures {
val webcamsOnlyForModerator = false;
val moderatorPassword = "modpass"
val viewerPassword = "viewpass"
val activityReportAccessToken = "arToken"
val learningDashboardAccessToken = "ldToken"
val createTime = System.currentTimeMillis
val createDate = "Oct 26, 2015"
val isBreakout = false
Expand All @@ -53,7 +53,7 @@ trait AppsTestFixtures {
val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate,
meetingExpireIfNoUserJoinedInMinutes = meetingExpireIfNoUserJoinedInMinutes, meetingExpireWhenLastUserLeftInMinutes = meetingExpireWhenLastUserLeftInMinutes,
userInactivityInspectTimerInMinutes = userInactivityInspectTimerInMinutes, userInactivityThresholdInMinutes = userInactivityInspectTimerInMinutes, userActivitySignResponseDelayInMinutes = userActivitySignResponseDelayInMinutes)
val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword, activityReportAccessToken = activityReportAccessToken)
val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword, learningDashboardAccessToken = learningDashboardAccessToken)
val recordProp = RecordProp(record = record, autoStartRecording = autoStartRecording,
allowStartStopRecording = allowStartStopRecording, keepEvents = keepEvents )
val welcomeProp = WelcomeProp(welcomeMsgTemplate = welcomeMsgTemplate, welcomeMsg = welcomeMsg,
Expand Down
23 changes: 23 additions & 0 deletions bbb-activity-report/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Learning Dashboard will be accessible through https://yourdomain/learning-dashboard

# Dev Instructions

## Prepare destination directory
```
mkdir /var/bigbluebutton/learning-dashboard
chown bigbluebutton /var/bigbluebutton/learning-dashboard/
```

## Build instructions
```
cd bbb-learning-dashboard
rm -r node_modules
npm install
npm run build
cp -r build/* /var/bigbluebutton/learning-dashboard
```

## Update nginx config
```
cp bbb-learning-dashboard/learning-dashboard.nginx /etc/bigbluebutton/nginx/
```
5 changes: 0 additions & 5 deletions bbb-activity-report/activity-report.nginx

This file was deleted.

5 changes: 5 additions & 0 deletions bbb-activity-report/learning-dashboard.nginx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
location /learning-dashboard/ {
alias /var/bigbluebutton/learning-dashboard/;
autoindex off;
}

2 changes: 1 addition & 1 deletion bbb-activity-report/package.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "activity-report-app",
"name": "learning-dashboard",
"homepage": "/learning-dashboard/",
"version": "0.1.0",
"private": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ case class DurationProps(duration: Int, createdTime: Long, createdDate: String,
userActivitySignResponseDelayInMinutes: Int,
endWhenNoModerator: Boolean, endWhenNoModeratorDelayInMinutes: Int)

case class MeetingProp(name: String, extId: String, intId: String, isBreakout: Boolean, activityReportTracking: Boolean)
case class MeetingProp(name: String, extId: String, intId: String, isBreakout: Boolean, learningDashboardEnabled: Boolean)

case class BreakoutProps(
parentId: String,
Expand All @@ -20,7 +20,7 @@ case class BreakoutProps(
privateChatEnabled: Boolean
)

case class PasswordProp(moderatorPass: String, viewerPass: String, activityReportAccessToken: String)
case class PasswordProp(moderatorPass: String, viewerPass: String, learningDashboardAccessToken: String)

case class RecordProp(record: Boolean, autoStartRecording: Boolean, allowStartStopRecording: Boolean, keepEvents: Boolean)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ object UserRespondedToPollRecordMsg { val NAME = "UserRespondedToPollRecordMsg"
case class UserRespondedToPollRecordMsg(header: BbbClientMsgHeader, body: UserRespondedToPollRecordMsgBody) extends BbbCoreMsg
case class UserRespondedToPollRecordMsgBody(pollId: String, answerId: Int, answer: String, isSecret: Boolean)


object RespondToPollReqMsg { val NAME = "RespondToPollReqMsg" }
case class RespondToPollReqMsg(header: BbbClientMsgHeader, body: RespondToPollReqMsgBody) extends StandardMsg
case class RespondToPollReqMsgBody(requesterId: String, pollId: String, questionId: Int, answerId: Int)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,9 @@ case class DeletedRecordingSysMsgBody(recordId: String)
/**
* Sent from akka-apps to bbb-web to inform a summary of the meeting activities
*/
object ActivityReportEvtMsg { val NAME = "ActivityReportEvtMsg" }
case class ActivityReportEvtMsg(
object LearningDashboardEvtMsg { val NAME = "LearningDashboardEvtMsg" }
case class LearningDashboardEvtMsg(
header: BbbCoreHeaderWithMeetingId,
body: ActivityReportEvtMsgBody
body: LearningDashboardEvtMsgBody
) extends BbbCoreMsg
case class ActivityReportEvtMsgBody(activityJson: String)
case class LearningDashboardEvtMsgBody(activityJson: String)
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ trait TestFixtures {
val webcamsOnlyForModerator = false
val moderatorPassword = "modpass"
val viewerPassword = "viewpass"
val activityReportAccessToken = "arToken"
val learningDashboardAccessToken = "ldToken"
val createTime = System.currentTimeMillis
val createDate = "Oct 26, 2015"
val isBreakout = false
Expand All @@ -48,7 +48,7 @@ trait TestFixtures {
val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate,
meetingExpireIfNoUserJoinedInMinutes = meetingExpireIfNoUserJoinedInMinutes, meetingExpireWhenLastUserLeftInMinutes = meetingExpireWhenLastUserLeftInMinutes,
userInactivityInspectTimerInMinutes = userInactivityInspectTimerInMinutes, userInactivityThresholdInMinutes = userInactivityInspectTimerInMinutes, userActivitySignResponseDelayInMinutes = userActivitySignResponseDelayInMinutes)
val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword, activityReportAccessToken = activityReportAccessToken)
val password = PasswordProp(moderatorPass = moderatorPassword, viewerPass = viewerPassword, learningDashboardAccessToken = learningDashboardAccessToken)
val recordProp = RecordProp(record = record, autoStartRecording = autoStartRecording,
allowStartStopRecording = allowStartStopRecording, keepEvents = keepEvents)
val welcomeProp = WelcomeProp(welcomeMsgTemplate = welcomeMsgTemplate, welcomeMsg = welcomeMsg,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public class ApiParams {
public static final String SEQUENCE = "sequence";
public static final String VOICE_BRIDGE = "voiceBridge";
public static final String WEB_VOICE = "webVoice";
public static final String ACTIVITY_REPORT_TRACKING = "activityReportTracking";
public static final String ACTIVITY_REPORT_TRACKING = "learningDashboardEnabled";
public static final String WEBCAMS_ONLY_FOR_MODERATOR = "webcamsOnlyForModerator";
public static final String WELCOME = "welcome";
public static final String HTML5_INSTANCE_ID = "html5InstanceId";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,19 @@
import java.io.File;
import java.io.FileOutputStream;

public class ActivityService {
private static Logger log = LoggerFactory.getLogger(ActivityService.class);
private static String activitiesDir = "/var/bigbluebutton/activity-report";
public class LearningDashboardService {
private static Logger log = LoggerFactory.getLogger(LearningDashboardService.class);
private static String learningDashboardFilesDir = "/var/bigbluebutton/learning-dashboard";

public void writeActivityJsonFile(String meetingId, String activityReportAccessToken, String activityJson) {
public void writeActivityJsonFile(String meetingId, String learningDashboardAccessToken, String activityJson) {

try {
if(activityReportAccessToken.length() == 0) {
log.error("ActivityReport AccessToken not found. JSON file will not be saved for meeting {}.",meetingId);
if(learningDashboardAccessToken.length() == 0) {
log.error("LearningDashboard AccessToken not found. JSON file will not be saved for meeting {}.",meetingId);
return;
}

File baseDir = new File(this.getDestinationBaseDirectoryName(meetingId,activityReportAccessToken));
File baseDir = new File(this.getDestinationBaseDirectoryName(meetingId,learningDashboardAccessToken));
if (!baseDir.exists()) baseDir.mkdirs();

File jsonFile = new File(baseDir.getAbsolutePath() + File.separatorChar + "activity_report.json");
Expand All @@ -46,17 +46,17 @@ public void writeActivityJsonFile(String meetingId, String activityReportAccessT

fileOutput.close();

log.info("Activities JSON ({}) updated for meeting {}.",jsonFile.getAbsolutePath(),meetingId);
log.info("Learning Dashboard ({}) updated for meeting {}.",jsonFile.getAbsolutePath(),meetingId);
} catch(Exception e) {
System.out.println(e);
}
}

private String getDestinationBaseDirectoryName(String meetingId, String activityReportAccessToken) {
return activitiesDir + File.separatorChar + meetingId + File.separatorChar + activityReportAccessToken;
private String getDestinationBaseDirectoryName(String meetingId, String learningDashboardAccessToken) {
return learningDashboardFilesDir + File.separatorChar + meetingId + File.separatorChar + learningDashboardAccessToken;
}

public void setActivitiesDir(String dir) {
activitiesDir = dir;
public void setLearningDashboardFilesDir(String dir) {
learningDashboardFilesDir = dir;
}
}
Loading

0 comments on commit cd15f17

Please sign in to comment.