support for disable / delete team
This commit is contained in:
parent
ca71d3e149
commit
37bee1f6e5
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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>
|
||||
}
|
||||
|
|
72
app/views/team/showContent.scala.html
Normal file
72
app/views/team/showContent.scala.html
Normal 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>
|
|
@ -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(" "))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue