complete study members reload fix

study-members-event
Thibault Duplessis 2020-09-25 16:30:59 +02:00
parent 58b7acf8f9
commit 89b0f2af51
4 changed files with 32 additions and 22 deletions

View File

@ -1,11 +1,11 @@
package lila.study
import scala.concurrent.duration._
import akka.stream.scaladsl._
import actorApi.Who
import akka.stream.scaladsl._
import chess.Centis
import chess.format.pgn.{ Glyph, Tags }
import scala.concurrent.duration._
import lila.chat.{ Chat, ChatApi }
import lila.common.Bus
import lila.hub.actorApi.timeline.{ Propagate, StudyCreate, StudyLike }
@ -344,8 +344,9 @@ final class StudyApi(
sequenceStudy(studyId) { study =>
canActAsOwner(study, who.u) flatMap {
_ ?? {
val role = StudyMember.Role.byId.getOrElse(roleStr, StudyMember.Role.Read)
studyRepo.setRole(study, userId, role) >>- onMembersChange(study)
val role = StudyMember.Role.byId.getOrElse(roleStr, StudyMember.Role.Read)
val members = study.members.update(userId, _.copy(role = role))
studyRepo.setRole(study, userId, role) >>- onMembersChange(study, members, members.ids)
}
}
}
@ -358,10 +359,15 @@ final class StudyApi(
onError: String => Unit
) =
sequenceStudy(studyId) { study =>
inviter(byUserId, study, username, isPresent).addEffects(
err => onError(err.getMessage),
_ => onMembersChange(study)
)
inviter(byUserId, study, username, isPresent)
.addEffects(
err => onError(err.getMessage),
user => {
val members = study.members + StudyMember.make(user)
onMembersChange(study, members, members.ids)
}
)
.void
}
def kick(studyId: Study.Id, userId: User.ID)(who: Who) =
@ -371,8 +377,9 @@ final class StudyApi(
(isAdmin && !study.isOwner(userId)) || (study.isOwner(who.u) ^ (who.u == userId))
}
allowed ?? {
studyRepo.removeMember(study, userId)
} >>- onMembersChange(study, study.members.some)
studyRepo.removeMember(study, userId) >>-
onMembersChange(study, (study.members - userId), study.members.ids)
}
}
}
@ -381,14 +388,10 @@ final class StudyApi(
private def onMembersChange(
study: Study,
sendTo: Seq[User.ID] = none,
members: Option[StudyMembers] = none
) = {
(fuccess(members) orElse studyRepo.membersById(study.id)) foreach {
_ foreach { members =>
sendTo(study.id)(_.reloadMembers(members, sendTo))
}
}
members: StudyMembers,
sendToUserIds: Iterable[User.ID]
): Unit = {
sendTo(study.id)(_.reloadMembers(members, sendToUserIds))
indexStudy(study)
}

View File

@ -29,7 +29,7 @@ final private class StudyInvite(
study: Study,
invitedUsername: String,
getIsPresent: User.ID => Fu[Boolean]
): Funit =
): Fu[User] =
for {
_ <- !study.isOwner(byUserId) ?? fufail[Unit]("Only study owner can invite")
_ <- (study.nbMembers >= maxMembers) ?? fufail[Unit](s"Max study members reached: $maxMembers")
@ -70,7 +70,7 @@ final private class StudyInvite(
val notification = Notification.make(Notification.Notifies(invited.id), notificationContent)
notifyApi.addNotification(notification)
}(funit)
} yield ()
} yield invited
def admin(study: Study, user: User): Funit =
studyRepo.coll.update

View File

@ -26,6 +26,13 @@ object StudyMember {
case class StudyMembers(members: StudyMember.MemberMap) {
def +(member: StudyMember) = copy(members = members + (member.id -> member))
def -(userId: User.ID) = copy(members = members - userId)
def update(id: User.ID, f: StudyMember => StudyMember) = copy(
members = members.mapValues { m =>
if (m.id == id) f(m) else m
}.toMap
)
def contains(userId: User.ID): Boolean = members contains userId
def contains(user: User): Boolean = contains(user.id)

View File

@ -314,7 +314,7 @@ final private class StudySocket(
"w" -> who
)
)
def reloadMembers(members: StudyMembers, sendTo: Seq[User.ID])(studyId: Study.Id) =
def reloadMembers(members: StudyMembers, sendTo: Iterable[User.ID])(studyId: Study.Id) =
send(RP.Out.tellRoomUsers(studyId, sendTo, makeMessage("members", members)))
def setComment(pos: Position.Ref, comment: Comment, who: Who) =