better stream team members

pull/4348/head
Thibault Duplessis 2018-05-08 00:29:14 +02:00
parent be9b0a769e
commit 0dafca559b
3 changed files with 16 additions and 23 deletions

View File

@ -328,13 +328,11 @@ object Api extends LilaController {
sealed trait ApiResult
case class Data(json: JsValue) extends ApiResult
case class JsonStream(value: Enumerator[JsObject]) extends ApiResult
case object NoData extends ApiResult
case object Limited extends ApiResult
case class Custom(result: Result) extends ApiResult
def toApiResult(json: Option[JsValue]): ApiResult = json.fold[ApiResult](NoData)(Data.apply)
def toApiResult(json: Seq[JsValue]): ApiResult = Data(JsArray(json))
def toApiResult(stream: Enumerator[JsObject]): ApiResult = JsonStream(stream)
def CookieBasedApiRequest(js: Context => Fu[ApiResult]) = Open { ctx =>
js(ctx) map toHttp
@ -345,16 +343,16 @@ object Api extends LilaController {
private[controllers] val tooManyRequests = TooManyRequest(jsonError("Error 429: Too many requests! Try again later."))
private def toHttp(result: ApiResult): Result = result match {
def toHttp(result: ApiResult): Result = result match {
case Limited => tooManyRequests
case NoData => NotFound
case Custom(result) => result
case JsonStream(stream) =>
Ok.chunked {
stream &> Enumeratee.map { o =>
Json.stringify(o) + "\n"
}
}.withHeaders(CONTENT_TYPE -> ndJsonContentType)
case Data(json) => Ok(json) as JSON
}
def jsonStream(stream: Enumerator[JsObject]) = Ok.chunked {
stream &> Enumeratee.map { o =>
Json.stringify(o) + "\n"
}
}.withHeaders(CONTENT_TYPE -> ndJsonContentType)
}

View File

@ -2,6 +2,7 @@ package controllers
import lila.api.Context
import lila.app._
import lila.common.{ HTTPRequest, MaxPerSecond }
import lila.security.Granter
import lila.team.{ Joined, Motivate, Team => TeamModel, TeamRepo, MemberRepo }
import lila.user.{ User => UserModel }
@ -52,18 +53,15 @@ object Team extends LilaController {
_ <- Env.user.lightUserApi preloadMany info.userIds
} yield html.team.show(team, members, info)
def users(teamId: String) = Api.ApiRequest { req =>
import Api.limitedDefault
Env.team.api.team(teamId) flatMap {
_ ?? { team =>
val cost = 100
val ip = lila.common.HTTPRequest lastRemoteAddress req
Api.UsersRateLimitPerIP(ip, cost = cost) {
Api.UsersRateLimitGlobal("-", cost = cost, msg = ip.value) {
lila.mon.api.teamUsers.cost(cost)
def users(teamId: String) = Action.async { req =>
RequireHttp11(req) {
import Api.limitedDefault
Env.team.api.team(teamId) flatMap {
_ ?? { team =>
Api.GlobalLinearLimitPerIP(HTTPRequest lastRemoteAddress req) {
import play.api.libs.iteratee._
Api.toApiResult {
Env.team.memberStream(team, lila.common.MaxPerSecond(20)) &>
Api.jsonStream {
Env.team.memberStream(team, MaxPerSecond(20)) &>
Enumeratee.map(Env.api.userApi.one)
} |> fuccess
}

View File

@ -556,9 +556,6 @@ object mon {
}
}
object api {
object teamUsers {
val cost = incX("api.team-users.cost")
}
object userGames {
val cost = incX("api.user-games.cost")
}