package com.intrbiz.bergamot.ui.api;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import com.intrbiz.balsa.engine.route.Router;
import com.intrbiz.balsa.metadata.WithDataAdapter;
import com.intrbiz.bergamot.config.model.GroupCfg;
import com.intrbiz.bergamot.data.BergamotDB;
import com.intrbiz.bergamot.metadata.IgnoreBinding;
import com.intrbiz.bergamot.metadata.IsaObjectId;
import com.intrbiz.bergamot.model.ActiveCheck;
import com.intrbiz.bergamot.model.Check;
import com.intrbiz.bergamot.model.Group;
import com.intrbiz.bergamot.model.Site;
import com.intrbiz.bergamot.model.message.CheckMO;
import com.intrbiz.bergamot.model.message.GroupMO;
import com.intrbiz.bergamot.ui.BergamotApp;
import com.intrbiz.metadata.Get;
import com.intrbiz.metadata.JSON;
import com.intrbiz.metadata.ListOf;
import com.intrbiz.metadata.Prefix;
import com.intrbiz.metadata.RequireValidPrincipal;
import com.intrbiz.metadata.Var;
import com.intrbiz.metadata.XML;
@Prefix("/api/group")
@RequireValidPrincipal()
public class GroupAPIRouter extends Router<BergamotApp>
{
@Get("/")
@JSON
@WithDataAdapter(BergamotDB.class)
@ListOf(GroupMO.class)
public List<GroupMO> getGroups(BergamotDB db, @Var("site") Site site)
{
return db.listGroups(site.getId()).stream().filter((g) -> permission("read", g)).map((x) -> x.toStubMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/roots")
@JSON
@WithDataAdapter(BergamotDB.class)
@ListOf(GroupMO.class)
public List<GroupMO> getRootGroups(BergamotDB db, @Var("site") Site site)
{
return db.getRootGroups(site.getId()).stream().filter((g) -> permission("read", g)).map((x) -> x.toMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/id/:id")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
public GroupMO getGroup(BergamotDB db, @IsaObjectId() UUID id)
{
Group group = notNull(db.getGroup(id));
require(permission("read", group));
return group.toMO(currentPrincipal());
}
@Get("/id/:id/children")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(GroupMO.class)
public List<GroupMO> getGroupChildren(BergamotDB db, @IsaObjectId() UUID id)
{
Group group = notNull(db.getGroup(id));
require(permission("read", group));
return group.getChildren().stream().filter((g) -> permission("read", g)).map((x) -> x.toMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/id/:id/checks")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(CheckMO.class)
public List<CheckMO> getGroupChecks(BergamotDB db, @IsaObjectId() UUID id)
{
Group group = notNull(db.getGroup(id));
require(permission("read", group));
return group.getChecks().stream().filter((c) -> permission("read", c)).map((c) -> {return (CheckMO) c.toMO(currentPrincipal());}).collect(Collectors.toList());
}
@Get("/name/:name")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
public GroupMO getGroupByName(BergamotDB db, @Var("site") Site site, String name)
{
Group group = notNull(db.getGroupByName(site.getId(), name));
require(permission("read", group));
return group.toMO(currentPrincipal());
}
@Get("/name/:name/children")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(GroupMO.class)
public List<GroupMO> getGroupChildrenByName(BergamotDB db, @Var("site") Site site, String name)
{
Group group = notNull(db.getGroupByName(site.getId(), name));
require(permission("read", group));
return group.getChildren().stream().filter((g) -> permission("read", g)).map((x) -> x.toMO(currentPrincipal())).collect(Collectors.toList());
}
@Get("/name/:name/checks")
@JSON(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@ListOf(CheckMO.class)
public List<CheckMO> getGroupChecksByName(BergamotDB db, @Var("site") Site site, String name)
{
Group group = notNull(db.getGroupByName(site.getId(), name));
require(permission("read", group));
return group.getChecks().stream().filter((c) -> permission("read", c)).map((c) -> {return (CheckMO) c.toMO(currentPrincipal());}).collect(Collectors.toList());
}
@Get("/id/:id/execute-all-checks")
@JSON()
@WithDataAdapter(BergamotDB.class)
public String executeChecksInGroup(BergamotDB db, @IsaObjectId() UUID id)
{
Group group = notNull(db.getGroup(id));
int executed = 0;
for (Check<?,?> check : group.getChecks())
{
if (check instanceof ActiveCheck)
{
if (permission("execute", check))
{
action("execute-check", check);
executed++;
}
}
}
return "Ok, executed " + executed + " checks";
}
@Get("/name/:name/config.xml")
@XML(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@IgnoreBinding
public GroupCfg getGroupConfigByName(BergamotDB db, @Var("site") Site site, String name)
{
Group group = notNull(db.getGroupByName(site.getId(), name));
require(permission("read.config", group));
return group.getConfiguration();
}
@Get("/id/:id/config.xml")
@XML(notFoundIfNull = true)
@WithDataAdapter(BergamotDB.class)
@IgnoreBinding
public GroupCfg getGroupConfig(BergamotDB db, @IsaObjectId() UUID id)
{
Group group = notNull(db.getGroup(id));
require(permission("read.config", group));
return group.getConfiguration();
}
}