remove unused code

This commit is contained in:
Ramón Souza 2023-06-22 15:35:40 -03:00
parent ae1e6079e1
commit af670883c1
22 changed files with 28 additions and 60 deletions

View File

@ -18,9 +18,8 @@ object BreakoutModel {
captureSlides: Boolean,
captureNotesFilename: String,
captureSlidesFilename: String,
includeMods: Boolean,
): BreakoutRoom2x = {
new BreakoutRoom2x(id, externalId, name, parentId, sequence, shortName, isDefaultName, freeJoin, voiceConf, assignedUsers, Vector(), Vector(), None, false, captureNotes, captureSlides, captureNotesFilename, captureSlidesFilename, includeMods)
new BreakoutRoom2x(id, externalId, name, parentId, sequence, shortName, isDefaultName, freeJoin, voiceConf, assignedUsers, Vector(), Vector(), None, false, captureNotes, captureSlides, captureNotesFilename, captureSlidesFilename)
}
}
@ -28,7 +27,8 @@ object BreakoutModel {
case class BreakoutModel(
startedOn: Option[Long],
durationInSeconds: Int,
rooms: Map[String, BreakoutRoom2x]
rooms: Map[String, BreakoutRoom2x],
sendInviteToModerators: Boolean,
) {
def find(id: String): Option[BreakoutRoom2x] = {

View File

@ -35,12 +35,12 @@ trait BreakoutRoomCreatedMsgHdlr {
}
}
def buildBreakoutRoomsListEvtMsg(meetingId: String, rooms: Vector[BreakoutRoomInfo], roomsReady: Boolean): BbbCommonEnvCoreMsg = {
def buildBreakoutRoomsListEvtMsg(meetingId: String, rooms: Vector[BreakoutRoomInfo], roomsReady: Boolean, sendInviteToModerators: Boolean): BbbCommonEnvCoreMsg = {
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used")
val envelope = BbbCoreEnvelope(BreakoutRoomsListEvtMsg.NAME, routing)
val header = BbbClientMsgHeader(BreakoutRoomsListEvtMsg.NAME, meetingId, "not-used")
val body = BreakoutRoomsListEvtMsgBody(meetingId, rooms, roomsReady)
val body = BreakoutRoomsListEvtMsgBody(meetingId, rooms, roomsReady, sendInviteToModerators)
val event = BreakoutRoomsListEvtMsg(header, body)
BbbCommonEnvCoreMsg(envelope, event)
}
@ -52,12 +52,12 @@ trait BreakoutRoomCreatedMsgHdlr {
(redirectToHtml5JoinURL, redirectJoinURL) <- BreakoutHdlrHelpers.getRedirectUrls(liveMeeting, user, r.externalId, r.sequence.toString())
} yield (user -> redirectToHtml5JoinURL)
new BreakoutRoomInfo(r.name, r.externalId, r.id, r.sequence, r.shortName, r.isDefaultName, r.freeJoin, html5JoinUrls.toMap, r.captureNotes, r.captureSlides, r.includeMods)
new BreakoutRoomInfo(r.name, r.externalId, r.id, r.sequence, r.shortName, r.isDefaultName, r.freeJoin, html5JoinUrls.toMap, r.captureNotes, r.captureSlides)
}
log.info("Sending breakout rooms list to {} with containing {} room(s)", liveMeeting.props.meetingProp.intId, breakoutRooms.length)
val msgEvent = buildBreakoutRoomsListEvtMsg(liveMeeting.props.meetingProp.intId, breakoutRooms, true)
val msgEvent = buildBreakoutRoomsListEvtMsg(liveMeeting.props.meetingProp.intId, breakoutRooms, true, breakoutModel.sendInviteToModerators)
outGW.send(msgEvent)
breakoutModel
@ -79,7 +79,7 @@ trait BreakoutRoomCreatedMsgHdlr {
BbbCommonEnvCoreMsg(envelope, event)
}
val breakoutInfo = BreakoutRoomInfo(room.name, room.externalId, room.id, room.sequence, room.shortName, room.isDefaultName, room.freeJoin, Map(), room.captureNotes, room.captureSlides, room.includeMods)
val breakoutInfo = BreakoutRoomInfo(room.name, room.externalId, room.id, room.sequence, room.shortName, room.isDefaultName, room.freeJoin, Map(), room.captureNotes, room.captureSlides)
val event = build(liveMeeting.props.meetingProp.intId, breakoutInfo)
outGW.send(event)

View File

@ -11,14 +11,14 @@ trait BreakoutRoomsListMsgHdlr {
def handleBreakoutRoomsListMsg(msg: BreakoutRoomsListMsg, state: MeetingState2x): MeetingState2x = {
def broadcastEvent(rooms: Vector[BreakoutRoomInfo], roomsReady: Boolean): Unit = {
def broadcastEvent(rooms: Vector[BreakoutRoomInfo], roomsReady: Boolean, sendInviteToModerators: Boolean): Unit = {
log.info("Sending breakout rooms list to {} with containing {} room(s)", props.meetingProp.intId, rooms.length)
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, props.meetingProp.intId, msg.header.userId)
val envelope = BbbCoreEnvelope(BreakoutRoomsListEvtMsg.NAME, routing)
val header = BbbClientMsgHeader(BreakoutRoomsListEvtMsg.NAME, props.meetingProp.intId, msg.header.userId)
val body = BreakoutRoomsListEvtMsgBody(msg.body.meetingId, rooms, roomsReady)
val body = BreakoutRoomsListEvtMsgBody(msg.body.meetingId, rooms, roomsReady, sendInviteToModerators)
val event = BreakoutRoomsListEvtMsg(header, body)
val msgEvent = BbbCommonEnvCoreMsg(envelope, event)
outGW.send(msgEvent)
@ -28,10 +28,10 @@ trait BreakoutRoomsListMsgHdlr {
breakoutModel <- state.breakout
} yield {
val rooms = breakoutModel.rooms.values.toVector map { r =>
new BreakoutRoomInfo(r.name, r.externalId, r.id, r.sequence, r.shortName, r.isDefaultName, r.freeJoin, Map(), r.captureNotes, r.captureSlides, r.includeMods)
new BreakoutRoomInfo(r.name, r.externalId, r.id, r.sequence, r.shortName, r.isDefaultName, r.freeJoin, Map(), r.captureNotes, r.captureSlides)
}
val ready = breakoutModel.hasAllStarted()
broadcastEvent(rooms, ready)
broadcastEvent(rooms, ready, breakoutModel.sendInviteToModerators)
}
state

View File

@ -54,8 +54,7 @@ trait CreateBreakoutRoomsCmdMsgHdlr extends RightsManagementTrait {
val breakout = BreakoutModel.create(parentId, internalId, externalId, room.name, room.sequence, room.shortName,
room.isDefaultName, room.freeJoin, voiceConf, room.users, msg.body.captureNotes,
msg.body.captureSlides, room.captureNotesFilename, room.captureSlidesFilename,
msg.body.sendInviteToModerators)
msg.body.captureSlides, room.captureNotesFilename, room.captureSlidesFilename)
rooms = rooms + (breakout.id -> breakout)
}
@ -79,14 +78,13 @@ trait CreateBreakoutRoomsCmdMsgHdlr extends RightsManagementTrait {
breakout.captureSlides,
breakout.captureNotesFilename,
breakout.captureSlidesFilename,
breakout.includeMods,
)
val event = buildCreateBreakoutRoomSysCmdMsg(liveMeeting.props.meetingProp.intId, roomDetail)
outGW.send(event)
}
val breakoutModel = new BreakoutModel(None, msg.body.durationInMinutes * 60, rooms)
val breakoutModel = new BreakoutModel(None, msg.body.durationInMinutes * 60, rooms, msg.body.sendInviteToModerators)
state.update(Some(breakoutModel))
}

View File

@ -19,7 +19,6 @@ case class BreakoutRoom2x(
captureSlides: Boolean,
captureNotesFilename: String,
captureSlidesFilename: String,
includeMods: Boolean,
) {
}

View File

@ -10,8 +10,8 @@ object BreakoutRooms {
def breakoutRoomsdurationInMinutes(status: BreakoutRooms, duration: Int) = status.breakoutRoomsdurationInMinutes = duration
def newBreakoutRoom(parentRoomId: String, id: String, externalMeetingId: String, name: String, sequence: Integer, freeJoin: Boolean,
voiceConfId: String, assignedUsers: Vector[String], captureNotes: Boolean, captureSlides: Boolean, includeMods: Boolean, breakoutRooms: BreakoutRooms): Option[BreakoutRoomVO] = {
val brvo = new BreakoutRoomVO(id, externalMeetingId, name, parentRoomId, sequence, freeJoin, voiceConfId, assignedUsers, Vector(), captureNotes, captureSlides, includeMods)
voiceConfId: String, assignedUsers: Vector[String], captureNotes: Boolean, captureSlides: Boolean, breakoutRooms: BreakoutRooms): Option[BreakoutRoomVO] = {
val brvo = new BreakoutRoomVO(id, externalMeetingId, name, parentRoomId, sequence, freeJoin, voiceConfId, assignedUsers, Vector(), captureNotes, captureSlides)
breakoutRooms.add(brvo)
Some(brvo)
}

View File

@ -52,7 +52,7 @@ trait AppsTestFixtures {
val breakoutProps = BreakoutProps(parentId = parentMeetingId, sequence = sequence,
freeJoin = false, captureNotes = false, captureSlides = false,
breakoutRooms = Vector(), captureNotesFilename = captureNotesFilename,
captureSlidesFilename = captureSlidesFilename, includeMods = false)
captureSlidesFilename = captureSlidesFilename)
val meetingProp = MeetingProp(name = meetingName, extId = externalMeetingId, intId = meetingId,
meetingCameraCap = meetingCameraCap,

View File

@ -30,7 +30,6 @@ case class BreakoutProps(
captureSlides: Boolean,
captureNotesFilename: String,
captureSlidesFilename: String,
includeMods: Boolean,
)
case class PasswordProp(moderatorPass: String, viewerPass: String, learningDashboardAccessToken: String)

View File

@ -12,8 +12,8 @@ case class BreakoutRoomJoinURLEvtMsgBody(parentId: String, breakoutId: String, e
// Outgoing messages
object BreakoutRoomsListEvtMsg { val NAME = "BreakoutRoomsListEvtMsg" }
case class BreakoutRoomsListEvtMsg(header: BbbClientMsgHeader, body: BreakoutRoomsListEvtMsgBody) extends BbbCoreMsg
case class BreakoutRoomsListEvtMsgBody(meetingId: String, rooms: Vector[BreakoutRoomInfo], roomsReady: Boolean)
case class BreakoutRoomInfo(name: String, externalId: String, breakoutId: String, sequence: Int, shortName: String, isDefaultName: Boolean, freeJoin: Boolean, html5JoinUrls: Map[String, String], captureNotes: Boolean, captureSlides: Boolean, sendInviteToModerators: Boolean)
case class BreakoutRoomsListEvtMsgBody(meetingId: String, rooms: Vector[BreakoutRoomInfo], roomsReady: Boolean, sendInviteToModerators: Boolean)
case class BreakoutRoomInfo(name: String, externalId: String, breakoutId: String, sequence: Int, shortName: String, isDefaultName: Boolean, freeJoin: Boolean, html5JoinUrls: Map[String, String], captureNotes: Boolean, captureSlides: Boolean)
object BreakoutRoomsListMsg { val NAME = "BreakoutRoomsListMsg" }
case class BreakoutRoomsListMsg(header: BbbClientMsgHeader, body: BreakoutRoomsListMsgBody) extends StandardMsg
@ -63,7 +63,6 @@ case class BreakoutRoomDetail(
captureSlides: Boolean,
captureNotesFilename: String,
captureSlidesFilename: String,
includeMods: Boolean,
)
/**
@ -128,5 +127,5 @@ case class BreakoutUserVO(id: String, name: String)
case class BreakoutRoomVO(id: String, externalId: String, name: String, parentId: String,
sequence: Int, freeJoin: Boolean, voiceConf: String,
assignedUsers: Vector[String], users: Vector[BreakoutUserVO], captureNotes: Boolean, captureSlides: Boolean, includeMods: Boolean)
assignedUsers: Vector[String], users: Vector[BreakoutUserVO], captureNotes: Boolean, captureSlides: Boolean)

View File

@ -55,7 +55,7 @@ trait TestFixtures {
val breakoutProps = BreakoutProps(parentId = parentMeetingId, sequence = sequence, freeJoin = false, captureNotes = false,
captureSlides = false, breakoutRooms = Vector(),
endWhenNoModerator = endWhenNoModerator, endWhenNoModeratorDelayInMinutes = endWhenNoModeratorDelayInMinutes,
captureNotesFilename = captureNotesFilename, captureSlidesFilename = captureSlidesFilename, includeMods = false)
captureNotesFilename = captureNotesFilename, captureSlidesFilename = captureSlidesFilename)
val durationProps = DurationProps(duration = durationInMinutes, createdTime = createTime, createdDate = createDate,
meetingExpireIfNoUserJoinedInMinutes = meetingExpireIfNoUserJoinedInMinutes, meetingExpireWhenLastUserLeftInMinutes = meetingExpireWhenLastUserLeftInMinutes,

View File

@ -77,7 +77,6 @@ public class ApiParams {
public static final String PRESENTATION_UPLOAD_EXTERNAL_DESCRIPTION = "presentationUploadExternalDescription";
public static final String PRESENTATION_UPLOAD_EXTERNAL_URL = "presentationUploadExternalUrl";
public static final String BREAKOUT_ROOMS_INCLUDE_MODS = "breakoutRoomsIncludeMods";
public static final String BREAKOUT_ROOMS_CAPTURE_SLIDES = "breakoutRoomsCaptureSlides";
public static final String BREAKOUT_ROOMS_CAPTURE_NOTES = "breakoutRoomsCaptureNotes";
public static final String BREAKOUT_ROOMS_CAPTURE_SLIDES_FILENAME = "breakoutRoomsCaptureSlidesFilename";

View File

@ -364,7 +364,6 @@ public class MeetingService implements MessageListener {
breakoutMetadata.put("freeJoin", m.isFreeJoin().toString());
breakoutMetadata.put("captureSlides", m.isCaptureSlides().toString());
breakoutMetadata.put("captureNotes", m.isCaptureNotes().toString());
breakoutMetadata.put("includeMods", m.isIncludeMods().toString());
breakoutMetadata.put("parentMeetingId", m.getParentMeetingId());
storeService.recordBreakoutInfo(m.getInternalId(), breakoutMetadata);
}
@ -378,7 +377,6 @@ public class MeetingService implements MessageListener {
logData.put("freeJoin", m.isFreeJoin());
logData.put("captureSlides", m.isCaptureSlides());
logData.put("captureNotes", m.isCaptureNotes());
logData.put("includeMods", m.isIncludeMods());
logData.put("parentMeetingId", m.getParentMeetingId());
}
logData.put("name", m.getName());
@ -634,7 +632,6 @@ public class MeetingService implements MessageListener {
params.put(ApiParams.IS_BREAKOUT, "true");
params.put(ApiParams.SEQUENCE, message.sequence.toString());
params.put(ApiParams.FREE_JOIN, message.freeJoin.toString());
params.put(ApiParams.BREAKOUT_ROOMS_INCLUDE_MODS, message.includeMods.toString());
params.put(ApiParams.BREAKOUT_ROOMS_CAPTURE_SLIDES, message.captureSlides.toString());
params.put(ApiParams.BREAKOUT_ROOMS_CAPTURE_NOTES, message.captureNotes.toString());
params.put(ApiParams.BREAKOUT_ROOMS_CAPTURE_NOTES_FILENAME, message.captureNotesFilename.toString());

View File

@ -113,7 +113,6 @@ public class ParamsProcessorUtil {
private boolean defaultBreakoutRoomsRecord;
private boolean defaultBreakoutRoomsCaptureSlides = false;
private boolean defaultBreakoutRoomsCaptureNotes = false;
private boolean defaultBreakoutRoomsIncludeMods = false;
private String defaultBreakoutRoomsCaptureSlidesFilename = CONF_NAME;
private String defaultBreakoutRoomsCaptureNotesFilename = CONF_NAME;
private boolean defaultbreakoutRoomsPrivateChatEnabled;
@ -287,12 +286,6 @@ public class ParamsProcessorUtil {
breakoutRoomsPrivateChatEnabled = Boolean.parseBoolean(breakoutRoomsPrivateChatEnabledParam);
}
Boolean breakoutRoomsIncludeMods = defaultBreakoutRoomsIncludeMods;
String breakoutRoomsIncludeModsParam = params.get(ApiParams.BREAKOUT_ROOMS_INCLUDE_MODS);
if (!StringUtils.isEmpty(breakoutRoomsIncludeModsParam)) {
breakoutRoomsIncludeMods = Boolean.parseBoolean(breakoutRoomsIncludeModsParam);
}
Boolean breakoutRoomsCaptureSlides = defaultBreakoutRoomsCaptureSlides;
String breakoutRoomsCaptureParam = params.get(ApiParams.BREAKOUT_ROOMS_CAPTURE_SLIDES);
if (!StringUtils.isEmpty(breakoutRoomsCaptureParam)) {
@ -317,7 +310,7 @@ public class ParamsProcessorUtil {
breakoutRoomsCaptureSlidesFilename = breakoutRoomsCaptureSlidesFilenameParam;
}
return new BreakoutRoomsParams(breakoutRoomsRecord, breakoutRoomsPrivateChatEnabled, breakoutRoomsCaptureNotes, breakoutRoomsCaptureSlides, breakoutRoomsCaptureNotesFilename, breakoutRoomsCaptureSlidesFilename, breakoutRoomsIncludeMods);
return new BreakoutRoomsParams(breakoutRoomsRecord, breakoutRoomsPrivateChatEnabled, breakoutRoomsCaptureNotes, breakoutRoomsCaptureSlides, breakoutRoomsCaptureNotesFilename, breakoutRoomsCaptureSlidesFilename);
}
private LockSettingsParams processLockSettingsParams(Map<String, String> params) {
@ -813,7 +806,6 @@ public class ParamsProcessorUtil {
if (isBreakout) {
meeting.setSequence(Integer.parseInt(params.get(ApiParams.SEQUENCE)));
meeting.setFreeJoin(Boolean.parseBoolean(params.get(ApiParams.FREE_JOIN)));
meeting.setIncludeMods(Boolean.parseBoolean(params.get(ApiParams.BREAKOUT_ROOMS_INCLUDE_MODS)));
meeting.setCaptureSlides(Boolean.parseBoolean(params.get(ApiParams.BREAKOUT_ROOMS_CAPTURE_SLIDES)));
meeting.setCaptureNotes(Boolean.parseBoolean(params.get(ApiParams.BREAKOUT_ROOMS_CAPTURE_NOTES)));
meeting.setCaptureNotesFilename(params.get(ApiParams.BREAKOUT_ROOMS_CAPTURE_NOTES_FILENAME));

View File

@ -7,12 +7,10 @@ public class BreakoutRoomsParams {
public final Boolean captureSlides;
public final String captureNotesFilename;
public final String captureSlidesFilename;
public final Boolean includeMods;
public BreakoutRoomsParams(Boolean record, Boolean privateChatEnabled, Boolean captureNotes, Boolean captureSlides, String captureNotesFilename, String captureSlidesFilename, Boolean includeMods) {
public BreakoutRoomsParams(Boolean record, Boolean privateChatEnabled, Boolean captureNotes, Boolean captureSlides, String captureNotesFilename, String captureSlidesFilename) {
this.record = record;
this.privateChatEnabled = privateChatEnabled;
this.includeMods = includeMods;
this.captureNotes = captureNotes;
this.captureSlides = captureSlides;
this.captureNotesFilename = captureNotesFilename;

View File

@ -45,7 +45,6 @@ public class Meeting {
private Boolean freeJoin = false;
private Boolean captureSlides = false;
private Boolean captureNotes = false;
private Boolean includeMods = false;
private String captureSlidesFilename = "bbb-none";
private String captureNotesFilename = "bbb-none";
private Integer duration = 0;
@ -330,14 +329,6 @@ public class Meeting {
this.captureSlides = captureSlides;
}
public Boolean isIncludeMods() {
return includeMods;
}
public void setIncludeMods(Boolean include) {
this.includeMods = include;
}
public Boolean isCaptureNotes() {
return captureNotes;
}

View File

@ -19,7 +19,6 @@ public class CreateBreakoutRoom implements IMessage {
public final Integer sourcePresentationSlide;
public final Boolean record;
public final Boolean privateChatEnabled;
public final Boolean includeMods; // Include moderators in breakout room invitation
public final Boolean captureNotes; // Upload shared notes to main room after breakout room end
public final Boolean captureSlides; // Upload annotated breakout slides to main room after breakout room end
public final String captureNotesFilename;
@ -44,8 +43,7 @@ public class CreateBreakoutRoom implements IMessage {
Boolean captureNotes,
Boolean captureSlides,
String captureNotesFilename,
String captureSlidesFilename,
Boolean includeMods) {
String captureSlidesFilename) {
this.meetingId = meetingId;
this.parentMeetingId = parentMeetingId;
this.name = name;
@ -66,6 +64,5 @@ public class CreateBreakoutRoom implements IMessage {
this.captureSlides = captureSlides;
this.captureNotesFilename = captureNotesFilename;
this.captureSlidesFilename = captureSlidesFilename;
this.includeMods = includeMods;
}
}

View File

@ -199,7 +199,6 @@ class BbbWebApiGWApp(
captureSlides = breakoutParams.captureSlides.booleanValue(),
captureNotesFilename = breakoutParams.captureNotesFilename,
captureSlidesFilename = breakoutParams.captureSlidesFilename,
includeMods = breakoutParams.includeMods.booleanValue(),
)
val welcomeProp = WelcomeProp(welcomeMsgTemplate = welcomeMsgTemplate, welcomeMsg = welcomeMsg,

View File

@ -12,7 +12,7 @@ case class CreateBreakoutRoomMsg(meetingId: String, parentMeetingId: String,
name: String, sequence: Integer, freeJoin: Boolean, dialNumber: String,
voiceConfId: String, viewerPassword: String, moderatorPassword: String, duration: Int,
sourcePresentationId: String, sourcePresentationSlide: Int,
record: Boolean, captureNotes: Boolean, captureSlides: Boolean, captureNotesFilename: String, captureSlidesFilename: String, includeMods: Boolean) extends ApiMsg
record: Boolean, captureNotes: Boolean, captureSlides: Boolean, captureNotesFilename: String, captureSlidesFilename: String) extends ApiMsg
case class AddUserSession(token: String, session: UserSession)
case class RegisterUser(meetingId: String, intUserId: String, name: String, role: String,

View File

@ -107,7 +107,6 @@ class OldMeetingMsgHdlrActor(val olgMsgGW: OldMessageReceivedGW)
msg.body.room.captureSlides,
msg.body.room.captureNotesFilename,
msg.body.room.captureSlidesFilename,
msg.body.room.includeMods,
))
}

View File

@ -11,6 +11,7 @@ export default async function handleBreakoutRoomsList({ body }, meetingId) {
const {
meetingId: parentMeetingId,
rooms,
sendInviteToModerators,
} = body;
// set firstly the last seq, then client will know when receive all
@ -39,6 +40,7 @@ export default async function handleBreakoutRoomsList({ body }, meetingId) {
joinedUsers: [],
timeRemaining: DEFAULT_TIME_REMAINING,
parentMeetingId,
sendInviteToModerators,
...flat(breakoutWithoutUrls),
...urls,
},

View File

@ -80,7 +80,6 @@ export default async function addMeeting(meeting) {
captureSlides: Boolean,
captureNotesFilename: String,
captureSlidesFilename: String,
includeMods: Boolean,
},
meetingProp: {
intId: String,

View File

@ -64,7 +64,7 @@ export default {
isBreakoutRecordable: () => Meetings.findOne({ meetingId: Auth.meetingID },
{ fields: { 'breakoutProps.record': 1 } }).breakoutProps.record,
toggleRecording: () => makeCall('toggleRecording'),
createBreakoutRoom: (rooms, durationInMinutes, record = false, captureNotes = false, captureSlides = false, includeMods = false) => makeCall('createBreakoutRoom', rooms, durationInMinutes, record, captureNotes, captureSlides, includeMods),
createBreakoutRoom: (rooms, durationInMinutes, record = false, captureNotes = false, captureSlides = false, sendInviteToModerators = false) => makeCall('createBreakoutRoom', rooms, durationInMinutes, record, captureNotes, captureSlides, sendInviteToModerators),
sendInvitation: (breakoutId, userId) => makeCall('requestJoinURL', { breakoutId, userId }),
breakoutJoinedUsers: () => Breakouts.find({
joinedUsers: { $exists: true },