better stream team members
parent
be9b0a769e
commit
0dafca559b
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue