2013-04-02 09:45:45 -06:00
|
|
|
package lila.team
|
|
|
|
|
|
|
|
import org.scala_tools.time.Imports._
|
2013-04-03 11:12:38 -06:00
|
|
|
import akka.actor.ActorRef
|
2013-04-02 09:45:45 -06:00
|
|
|
|
2013-04-04 06:52:17 -06:00
|
|
|
import lila.user.{ User, Context }
|
|
|
|
import lila.user.tube.userTube
|
|
|
|
import tube._
|
2013-04-04 08:28:52 -06:00
|
|
|
import actorApi._
|
|
|
|
import lila.hub.actorApi.forum.MakeTeam
|
|
|
|
import lila.db.api._
|
2013-04-02 09:45:45 -06:00
|
|
|
|
2013-04-03 11:12:38 -06:00
|
|
|
final class TeamApi(
|
|
|
|
cached: Cached,
|
|
|
|
notifier: Notifier,
|
|
|
|
forum: ActorRef,
|
2013-04-04 08:28:52 -06:00
|
|
|
paginator: PaginatorBuilder,
|
|
|
|
indexer: ActorRef) {
|
2013-04-02 09:45:45 -06:00
|
|
|
|
2013-04-03 11:12:38 -06:00
|
|
|
val creationPeriod = 1.week
|
2013-04-02 09:45:45 -06:00
|
|
|
|
2013-04-04 08:28:52 -06:00
|
|
|
def create(setup: TeamSetup, me: User): Option[Fu[Team]] = me.canTeam option {
|
|
|
|
val s = setup.trim
|
|
|
|
val team = Team.make(
|
|
|
|
name = s.name,
|
|
|
|
location = s.location,
|
|
|
|
description = s.description,
|
|
|
|
open = s.isOpen,
|
|
|
|
createdBy = me)
|
|
|
|
$insert(team) >>
|
|
|
|
MemberRepo.add(team.id, me.id) >>
|
2013-05-06 07:48:05 -06:00
|
|
|
(cached.teamIds invalidate me.id) >>-
|
|
|
|
(forum ! MakeTeam(team.id, team.name)) >>-
|
2013-04-04 08:28:52 -06:00
|
|
|
(indexer ! InsertTeam(team)) inject team
|
|
|
|
}
|
|
|
|
|
|
|
|
def update(team: Team, edit: TeamEdit, me: User): Funit = edit.trim |> { e ⇒
|
|
|
|
team.copy(
|
|
|
|
location = e.location,
|
|
|
|
description = e.description,
|
|
|
|
open = e.isOpen
|
2013-05-06 07:48:05 -06:00
|
|
|
) |> { team ⇒ $update(team) >>- (indexer ! InsertTeam(team)) }
|
2013-04-04 08:28:52 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
def mine(me: User): Fu[List[Team]] =
|
|
|
|
cached teamIds me.id flatMap $find.byOrderedIds[Team]
|
|
|
|
|
|
|
|
def hasCreatedRecently(me: User): Fu[Boolean] =
|
|
|
|
TeamRepo.userHasCreatedSince(me.id, creationPeriod)
|
|
|
|
|
|
|
|
def requestsWithUsers(team: Team): Fu[List[RequestWithUser]] = for {
|
|
|
|
requests ← RequestRepo findByTeam team.id
|
|
|
|
users ← $find.byOrderedIds[User](requests map (_.user))
|
|
|
|
} yield requests zip users map {
|
|
|
|
case (request, user) ⇒ RequestWithUser(request, user)
|
|
|
|
}
|
|
|
|
|
|
|
|
def requestsWithUsers(user: User): Fu[List[RequestWithUser]] = for {
|
|
|
|
teamIds ← TeamRepo teamIdsByCreator user.id
|
|
|
|
requests ← RequestRepo findByTeams teamIds
|
|
|
|
users ← $find.byOrderedIds[User](requests map (_.user))
|
|
|
|
} yield requests zip users map {
|
|
|
|
case (request, user) ⇒ RequestWithUser(request, user)
|
|
|
|
}
|
|
|
|
|
|
|
|
def join(teamId: String)(implicit ctx: Context): Fu[Option[Requesting]] = for {
|
|
|
|
teamOption ← $find.byId[Team](teamId)
|
|
|
|
result ← ~(teamOption |@| ctx.me.filter(_.canTeam))({
|
|
|
|
case (team, user) if team.open ⇒
|
|
|
|
(doJoin(team, user.id) inject Joined(team).some): Fu[Option[Requesting]]
|
|
|
|
case (team, user) ⇒
|
|
|
|
fuccess(Motivate(team).some: Option[Requesting])
|
|
|
|
})
|
|
|
|
} yield result
|
|
|
|
|
|
|
|
def requestable(teamId: String, user: User): Fu[Option[Team]] = for {
|
|
|
|
teamOption ← $find.byId[Team](teamId)
|
|
|
|
able ← teamOption.zmap(requestable(_, user))
|
|
|
|
} yield teamOption filter (_ ⇒ able)
|
|
|
|
|
|
|
|
def requestable(team: Team, user: User): Fu[Boolean] =
|
|
|
|
RequestRepo.exists(team.id, user.id) zip belongsTo(team.id, user.id) map {
|
|
|
|
case (false, false) ⇒ true
|
|
|
|
case _ ⇒ false
|
|
|
|
}
|
|
|
|
|
|
|
|
def createRequest(team: Team, setup: RequestSetup, user: User): Funit =
|
|
|
|
requestable(team, user) flatMap { able ⇒
|
|
|
|
val request = Request.make(team = team.id, user = user.id, message = setup.message)
|
|
|
|
val rwu = RequestWithUser(request, user)
|
|
|
|
$insert(request) >> (cached.nbRequests invalidate team.createdBy) doIf able
|
|
|
|
}
|
|
|
|
|
|
|
|
def processRequest(team: Team, request: Request, accept: Boolean): Funit = for {
|
|
|
|
_ ← $remove(request)
|
|
|
|
_ ← cached.nbRequests invalidate team.createdBy
|
|
|
|
userOption ← $find.byId[User](request.user)
|
|
|
|
_ ← userOption.zmap(user ⇒
|
2013-05-06 07:48:05 -06:00
|
|
|
doJoin(team, user.id) >>- notifier.acceptRequest(team, request) doIf accept
|
2013-04-04 08:28:52 -06:00
|
|
|
)
|
|
|
|
} yield ()
|
|
|
|
|
|
|
|
def doJoin(team: Team, userId: String): Funit =
|
|
|
|
belongsTo(team.id, userId) flatMap { belongs ⇒
|
|
|
|
MemberRepo.add(team.id, userId) >>
|
|
|
|
TeamRepo.incMembers(team.id, +1) >>
|
|
|
|
(cached.teamIds invalidate userId) doUnless belongs
|
|
|
|
}
|
|
|
|
|
|
|
|
def quit(teamId: String)(implicit ctx: Context): Fu[Option[Team]] = for {
|
|
|
|
teamOption ← $find.byId[Team](teamId)
|
|
|
|
result ← ~(teamOption |@| ctx.me)({
|
|
|
|
case (team, user) ⇒ doQuit(team, user.id) inject team.some
|
|
|
|
})
|
|
|
|
} yield result
|
|
|
|
|
|
|
|
def doQuit(team: Team, userId: String): Funit =
|
|
|
|
belongsTo(team.id, userId) flatMap { belongs ⇒
|
|
|
|
MemberRepo.remove(team.id, userId) >>
|
|
|
|
TeamRepo.incMembers(team.id, -1) >>
|
|
|
|
(cached.teamIds invalidate userId) doIf belongs
|
|
|
|
}
|
|
|
|
|
|
|
|
def quitAll(userId: String): Funit = MemberRepo.removeByUser(userId)
|
|
|
|
|
|
|
|
def kick(team: Team, userId: String): Funit = doQuit(team, userId)
|
|
|
|
|
|
|
|
def enable(team: Team): Funit =
|
2013-05-06 07:48:05 -06:00
|
|
|
TeamRepo.enable(team) >>- (indexer ! InsertTeam(team))
|
2013-04-04 08:28:52 -06:00
|
|
|
|
|
|
|
def disable(team: Team): Funit =
|
2013-05-06 07:48:05 -06:00
|
|
|
TeamRepo.disable(team) >>- (indexer ! RemoveTeam(team.id))
|
2013-04-04 08:28:52 -06:00
|
|
|
|
|
|
|
// // delete for ever, with members but not forums
|
|
|
|
def delete(team: Team): Funit =
|
|
|
|
$remove(team) >>
|
2013-05-06 07:48:05 -06:00
|
|
|
MemberRepo.removeByteam(team.id) >>-
|
2013-04-04 08:28:52 -06:00
|
|
|
(indexer ! RemoveTeam(team.id))
|
|
|
|
|
|
|
|
def belongsTo(teamId: String, userId: String): Fu[Boolean] =
|
|
|
|
cached teamIds userId map (_ contains teamId)
|
2013-04-09 12:58:34 -06:00
|
|
|
|
|
|
|
def teamIds(userId: String) = cached teamIds userId
|
|
|
|
|
|
|
|
def teamName(teamId: String) = cached name teamId
|
|
|
|
|
|
|
|
def nbRequests(teamId: String) = cached nbRequests teamId
|
2013-04-03 11:12:38 -06:00
|
|
|
}
|