lila/modules/team/src/main/TeamApi.scala

149 lines
5.0 KiB
Scala
Raw Normal View History

2013-04-02 09:45:45 -06:00
package lila.team
import org.scala_tools.time.Imports._
import akka.actor.ActorRef
2013-04-02 09:45:45 -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
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
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
}