From 89b0f2af51b7214c11f842118108c42efc35744f Mon Sep 17 00:00:00 2001 From: Thibault Duplessis Date: Fri, 25 Sep 2020 16:30:59 +0200 Subject: [PATCH] complete study members reload fix --- modules/study/src/main/StudyApi.scala | 41 +++++++++++++----------- modules/study/src/main/StudyInvite.scala | 4 +-- modules/study/src/main/StudyMember.scala | 7 ++++ modules/study/src/main/StudySocket.scala | 2 +- 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/modules/study/src/main/StudyApi.scala b/modules/study/src/main/StudyApi.scala index 35453aeb88..a748590e41 100644 --- a/modules/study/src/main/StudyApi.scala +++ b/modules/study/src/main/StudyApi.scala @@ -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) } diff --git a/modules/study/src/main/StudyInvite.scala b/modules/study/src/main/StudyInvite.scala index 4ec7e08174..8870f3bc57 100644 --- a/modules/study/src/main/StudyInvite.scala +++ b/modules/study/src/main/StudyInvite.scala @@ -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 diff --git a/modules/study/src/main/StudyMember.scala b/modules/study/src/main/StudyMember.scala index af92aa7b7a..d284a01036 100644 --- a/modules/study/src/main/StudyMember.scala +++ b/modules/study/src/main/StudyMember.scala @@ -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) diff --git a/modules/study/src/main/StudySocket.scala b/modules/study/src/main/StudySocket.scala index 5baeeed375..b54f56cb9c 100644 --- a/modules/study/src/main/StudySocket.scala +++ b/modules/study/src/main/StudySocket.scala @@ -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) =