show marks on appeal list - closes lichess-org/tavern#129

pull/9470/head
Thibault Duplessis 2021-07-26 09:19:31 +02:00
parent a069e44f4f
commit da51dbffba
4 changed files with 53 additions and 23 deletions

View File

@ -54,12 +54,10 @@ final class Appeal(env: Env, reportC: => Report, prismicC: => Prismic, userC: =>
def queue = def queue =
Secure(_.Appeals) { implicit ctx => me => Secure(_.Appeals) { implicit ctx => me =>
env.appeal.api.queueOf( env.appeal.api.queueOf(me.user) zip env.report.api.inquiries.allBySuspect zip reportC.getScores map {
me.user
) zip env.report.api.inquiries.allBySuspect zip reportC.getScores flatMap {
case ((appeals, inquiries), ((scores, streamers), nbAppeals)) => case ((appeals, inquiries), ((scores, streamers), nbAppeals)) =>
(env.user.lightUserApi preloadMany appeals.map(_.id)) inject env.user.lightUserApi preloadUsers appeals.map(_.user)
Ok(html.appeal.queue(appeals, inquiries, scores, streamers, nbAppeals)) Ok(html.appeal.queue(appeals, inquiries, scores, streamers, nbAppeals))
} }
} }

View File

@ -13,7 +13,7 @@ import lila.user.User
object queue { object queue {
def apply( def apply(
appeals: List[Appeal], appeals: List[Appeal.WithUser],
inquiries: Map[User.ID, Inquiry], inquiries: Map[User.ID, Inquiry],
scores: lila.report.Room.Scores, scores: lila.report.Room.Scores,
streamers: Int, streamers: Int,
@ -29,10 +29,12 @@ object queue {
) )
), ),
tbody( tbody(
appeals.map { appeal => appeals.map { case Appeal.WithUser(appeal, user) =>
tr(cls := List("new" -> appeal.isUnread))( tr(cls := List("new" -> appeal.isUnread))(
td( td(
userIdLink(appeal.id.some) userIdLink(appeal.id.some),
br,
views.html.user.mod.userMarks(user, None)
), ),
td(appeal.msgs.lastOption map { msg => td(appeal.msgs.lastOption map { msg =>
frag( frag(

View File

@ -69,6 +69,8 @@ object Appeal {
def apply(key: String) = all.find(_.key == key) def apply(key: String) = all.find(_.key == key)
} }
case class WithUser(appeal: Appeal, user: User)
val maxLength = 1000 val maxLength = 1000
import play.api.data._ import play.api.data._

View File

@ -4,6 +4,7 @@ import org.joda.time.DateTime
import lila.db.dsl._ import lila.db.dsl._
import lila.user.{ Holder, NoteApi, User, UserRepo } import lila.user.{ Holder, NoteApi, User, UserRepo }
import reactivemongo.api.ReadPreference
final class AppealApi( final class AppealApi(
coll: Coll, coll: Coll,
@ -61,25 +62,52 @@ final class AppealApi(
def countUnread = coll.countSel($doc("status" -> Appeal.Status.Unread.key)) def countUnread = coll.countSel($doc("status" -> Appeal.Status.Unread.key))
def queueOf(mod: User) = queue(snoozer snoozedKeysOf mod.id map (_.appealId)) def queueOf(mod: User) = bothQueues(snoozer snoozedKeysOf mod.id map (_.appealId))
private def queue(exceptIds: Iterable[User.ID]): Fu[List[Appeal]] = private def bothQueues(exceptIds: Iterable[User.ID]): Fu[List[Appeal.WithUser]] =
coll fetchQueue(
.find($doc("status" -> Appeal.Status.Unread.key) ++ { selector = $doc("status" -> Appeal.Status.Unread.key) ++ {
exceptIds.nonEmpty ?? $doc("_id" $nin exceptIds) exceptIds.nonEmpty ?? $doc("_id" $nin exceptIds)
}) },
.sort($doc("firstUnrepliedAt" -> 1)) ascending = true,
.cursor[Appeal]() nb = 30
.list(30) flatMap { unreads => ) flatMap { unreads =>
coll fetchQueue(
.find($doc("status" $ne Appeal.Status.Unread.key)) selector = $doc("status" $ne Appeal.Status.Unread.key),
.sort($doc("firstUnrepliedAt" -> -1)) ascending = false,
.cursor[Appeal]() nb = 40 - unreads.size
.list(40 - unreads.size) map { ) map { unreads ::: _ }
unreads ::: _
}
} }
private def fetchQueue(selector: Bdoc, ascending: Boolean, nb: Int): Fu[List[Appeal.WithUser]] =
coll
.aggregateList(
maxDocs = nb,
ReadPreference.secondaryPreferred
) { framework =>
import framework._
Match(selector) -> List(
Sort((if (ascending) Ascending.apply _ else Descending.apply _)("firstUnrepliedAt")),
Limit(nb),
PipelineOperator(
$lookup.simple(
from = userRepo.coll,
as = "user",
local = "_id",
foreign = "_id"
)
),
UnwindField("user")
)
}
.map { docs =>
for {
doc <- docs
appeal <- doc.asOpt[Appeal]
user <- doc.getAsOpt[User]("user")
} yield Appeal.WithUser(appeal, user)
}
def setRead(appeal: Appeal) = def setRead(appeal: Appeal) =
coll.update.one($id(appeal.id), appeal.read).void coll.update.one($id(appeal.id), appeal.read).void