support for disable / delete team

This commit is contained in:
Thibault Duplessis 2012-12-14 14:38:49 +01:00
parent ca71d3e149
commit 37bee1f6e5
7 changed files with 118 additions and 76 deletions

View file

@ -114,6 +114,10 @@ final class TeamApi(
io(cached invalidateTeamIds user.id)
} doIf belongsTo(team.id, user.id)
// delete for ever, with members but not forums
def delete(team: Team): IO[Unit] =
teamRepo.removeIO(team) >> memberRepo.removeByteamId(team.id)
def teamIds = cached.teamIds _
def belongsTo(teamId: String, userId: String): Boolean = teamIds(userId) contains teamId

View file

@ -55,13 +55,27 @@ final class TeamRepo(collection: MongoCollection)
update(selectId(teamId), $inc("nbMembers" -> by))
}
def enable(team: Team) = updateIO(team)($set("enabled" -> true))
def disable(team: Team) = updateIO(team)($set("enabled" -> false))
def updateIO(teamId: String)(op: Team DBObject): IO[Unit] = for {
teamOption byId(teamId)
_ ~teamOption.map(team updateIO(team)(op(team)))
} yield ()
def updateIO(team: Team)(obj: DBObject): IO[Unit] = io {
update(selectId(team), obj)
}
def addRequest(teamId: String, request: Request): IO[Unit] = io {
update(
selectId(teamId) ++ ("requests.user" $ne request.user),
$push("requests" -> request.user))
}
def selectId(id: String) = DBObject("_id" -> id)
def selectId(id: String): DBObject = DBObject("_id" -> id)
def selectId(team: Team): DBObject = selectId(team.id)
val enabledQuery = DBObject("enabled" -> true)

View file

@ -218,7 +218,7 @@ class UserRepo(collection: MongoCollection)
def updateIO(username: String)(op: User DBObject): IO[Unit] = for {
userOption byId(username)
_ userOption.fold(user updateIO(user)(op(user)), io())
_ ~userOption.map(user updateIO(user)(op(user)))
} yield ()
def updateIO(user: User)(obj: DBObject): IO[Unit] = io {

View file

@ -10,80 +10,13 @@
<span class="staff">CLOSED</span>
}
</div>
@if(info.mine || t.enabled) {
@if(info.hasRequests) {
@team.requests(t, info.requests)
}
<div class="team-content clearfix">
<div class="team-left">
<section class="infos">
<p>@trans.averageElo(): <strong>@info.averageElo</strong></p>
<p>@trans.teamLeader(): @userIdLinkMini(t.createdBy)</p>
</section>
<h2>@trans.teamBestPlayers()</h2>
<ol class="userlist best_players">
@info.bestPlayers.map { player =>
<li>@userLink(player)</li>
}
</ol>
<h2>@trans.teamRecentMembers()</h2>
<div class="infinitescroll">
@if(members.hasToPaginate) {
<div class="pager none"><a href="@routes.Team.show(t.id, members.nextPage | 1)">Next</a></div>
}
<ol class="userlist paginated_element">
@members.currentPageResults.map { member =>
<li>@userLink(member.user)</li>
}
</ol>
</div>
</div>
<div class="team-right">
<p class="description">
@autoLink(t.description)
@t.location.map { loc =>
<br />@trans.location(): @loc
}
</p>
<div class="actions">
@if(t.enabled && !info.mine) {
@if(info.requestedByMe) {
<strong>Your join request is being reviewed by the team leader</strong>
} else {
<form class="inline" method="post" action="@routes.Team.join(t.id)">
<input class="submit button" type="submit" value="@trans.joinTeam()" />
</form>
}
}
</div>
<div class="forum">
<h2><a href="@teamForumUrl(t.id)">@trans.forum() (@info.forumNbPosts)</a></h2>
<ol class="posts">
@info.forumPosts.take(5).map { v =>
@defining(routes.ForumTopic.show(v.categ.slug, v.topic.slug, v.topicLastPage) + "#" + v.post.number) { postUrl =>
<li>
<p class="meta clearfix">
<a href="@postUrl">@v.topic.name</a>
@authorLink(v.post, withOnline = false)
<span class="date">@showDate(v.post.createdAt)</span>
</p>
<p>@shorten(v.post.text, 200)</p>
</li>
}
}
</ol>
<a class="more" href="@teamForumUrl(t.id)">@t.name @trans.forum() »</a>
<div class="actions">
@if(info.mine && !info.createdByMe) {
<form class="quit" method="post" action="@routes.Team.quit(t.id)">
<input class="submit button small confirm" type="submit" value="@trans.quitTeam()" />
</form>
}
@if(info.createdByMe) {
<a href="@routes.Team.edit(t.id)" class="submit button small">@trans.settings()</a>
}
</div>
</div>
</div>
@team.showContent(t, members, info)
</div>
}
</div>
}

View file

@ -0,0 +1,72 @@
@(t: lila.team.Team, members: Paginator[lila.team.MemberWithUser], info: lila.team.TeamInfo)(implicit ctx: Context)
<div class="team-left">
<section class="infos">
<p>@trans.averageElo(): <strong>@info.averageElo</strong></p>
<p>@trans.teamLeader(): @userIdLinkMini(t.createdBy)</p>
</section>
<h2>@trans.teamBestPlayers()</h2>
<ol class="userlist best_players">
@info.bestPlayers.map { player =>
<li>@userLink(player)</li>
}
</ol>
<h2>@trans.teamRecentMembers()</h2>
<div class="infinitescroll">
@if(members.hasToPaginate) {
<div class="pager none"><a href="@routes.Team.show(t.id, members.nextPage | 1)">Next</a></div>
}
<ol class="userlist paginated_element">
@members.currentPageResults.map { member =>
<li>@userLink(member.user)</li>
}
</ol>
</div>
</div>
<div class="team-right">
<p class="description">
@autoLink(t.description)
@t.location.map { loc =>
<br />@trans.location(): @loc
}
</p>
<div class="actions">
@if(t.enabled && !info.mine) {
@if(info.requestedByMe) {
<strong>Your join request is being reviewed by the team leader</strong>
} else {
<form class="inline" method="post" action="@routes.Team.join(t.id)">
<input class="submit button" type="submit" value="@trans.joinTeam()" />
</form>
}
}
</div>
<div class="forum">
<h2><a href="@teamForumUrl(t.id)">@trans.forum() (@info.forumNbPosts)</a></h2>
<ol class="posts">
@info.forumPosts.take(5).map { v =>
@defining(routes.ForumTopic.show(v.categ.slug, v.topic.slug, v.topicLastPage) + "#" + v.post.number) { postUrl =>
<li>
<p class="meta clearfix">
<a href="@postUrl">@v.topic.name</a>
@authorLink(v.post, withOnline = false)
<span class="date">@showDate(v.post.createdAt)</span>
</p>
<p>@shorten(v.post.text, 200)</p>
</li>
}
}
</ol>
<a class="more" href="@teamForumUrl(t.id)">@t.name @trans.forum() »</a>
<div class="actions">
@if(info.mine && !info.createdByMe) {
<form class="quit" method="post" action="@routes.Team.quit(t.id)">
<input class="submit button small confirm" type="submit" value="@trans.quitTeam()" />
</form>
}
@if(info.createdByMe) {
<a href="@routes.Team.edit(t.id)" class="submit button small">@trans.settings()</a>
}
</div>
</div>
</div>

View file

@ -40,6 +40,10 @@ object Main {
case "wiki-fetch" :: Nil wiki.fetch
case "search-reset" :: Nil search.reset
case "team-join" :: team :: users teams.join(team, users)
case "team-quit" :: team :: users teams.quit(team, users)
case "team-enable" :: uid :: Nil teams enable uid
case "team-disable" :: uid :: Nil teams disable uid
case "team-delete" :: uid :: Nil teams delete uid
case _ putStrLn("Unknown command: " + args.mkString(" "))
}
}

View file

@ -11,11 +11,26 @@ case class Teams(
api: TeamApi) {
def join(teamId: String, userIds: List[String]): IO[Unit] =
perform(teamId, userIds) { (team: Team, user: User)
api.doJoin(team, user)
}
perform2(teamId, userIds)(api.doJoin _)
private def perform(teamId: String, userIds: List[String])(op: (Team, User) IO[Unit]) = for {
def quit(teamId: String, userIds: List[String]): IO[Unit] =
perform2(teamId, userIds)(api.doQuit _)
def enable(teamId: String): IO[Unit] = perform(teamId)(teamRepo.enable _)
def disable(teamId: String): IO[Unit] = perform(teamId)(teamRepo.disable _)
def delete(teamId: String): IO[Unit] = perform(teamId)(api.delete _)
private def perform(teamId: String)(op: Team IO[Unit]) = for {
teamOption teamRepo byId teamId.pp
_ teamOption.fold(
u op(u) flatMap { _ putStrLn("Success") },
putStrLn("Team not found")
)
} yield ()
private def perform2(teamId: String, userIds: List[String])(op: (Team, User) IO[Unit]) = for {
teamOption teamRepo byId teamId
_ teamOption.fold(
team for {