package com.intrbiz.bergamot.model;
import java.util.Collection;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import com.intrbiz.bergamot.config.model.TeamCfg;
import com.intrbiz.bergamot.data.BergamotDB;
import com.intrbiz.bergamot.model.message.TeamMO;
import com.intrbiz.data.db.compiler.meta.SQLColumn;
import com.intrbiz.data.db.compiler.meta.SQLTable;
import com.intrbiz.data.db.compiler.meta.SQLUnique;
import com.intrbiz.data.db.compiler.meta.SQLVersion;
/**
* A team of people, who can be notified
*/
@SQLTable(schema = BergamotDB.class, name = "team", since = @SQLVersion({ 1, 0, 0 }))
@SQLUnique(name = "name_unq", columns = { "site_id", "name" })
public class Team extends SecuredObject<TeamMO, TeamCfg>
{
private static final long serialVersionUID = 1L;
@SQLColumn(index = 1, name = "team_ids", type = "UUID[]", since = @SQLVersion({ 1, 0, 0 }))
private List<UUID> teamIds = new LinkedList<UUID>();
@SQLColumn(index = 2, name = "granted_permissions", type = "TEXT[]", since = @SQLVersion({ 1, 0, 0 }))
private List<String> grantedPermissions = new LinkedList<String>();
@SQLColumn(index = 3, name = "revoked_permissions", type = "TEXT[]", since = @SQLVersion({ 1, 0, 0 }))
private List<String> revokedPermissions = new LinkedList<String>();
public Team()
{
super();
}
@Override
public void configure(TeamCfg configuration, TeamCfg resolvedConfiguration)
{
super.configure(configuration, resolvedConfiguration);
// permissions
this.grantedPermissions.clear();
this.grantedPermissions.addAll(resolvedConfiguration.getGrantedPermissions());
this.revokedPermissions.clear();
this.revokedPermissions.addAll(resolvedConfiguration.getRevokedPermissions());
}
public List<UUID> getTeamIds()
{
return this.teamIds;
}
public void setTeamIds(List<UUID> teamIds)
{
this.teamIds = teamIds;
}
public List<Team> getTeams()
{
List<Team> r = new LinkedList<Team>();
try (BergamotDB db = BergamotDB.connect())
{
for (UUID id : this.getTeamIds())
{
r.add(db.getTeam(id));
}
}
return r;
}
public Collection<Team> getChildren()
{
try (BergamotDB db = BergamotDB.connect())
{
return db.getTeamsInTeam(this.getId());
}
}
public void removeChild(Team child)
{
try (BergamotDB db = BergamotDB.connect())
{
db.removeTeamChild(this, child);
}
}
public void addChild(Team child)
{
try (BergamotDB db = BergamotDB.connect())
{
db.addTeamChild(this, child);
}
}
public List<Contact> getAllContacts()
{
List<Contact> ret = new LinkedList<Contact>();
ret.addAll(this.getContacts());
for (Team child : this.getChildren())
{
ret.addAll(child.getAllContacts());
}
return ret;
}
public List<Contact> getContacts()
{
try (BergamotDB db = BergamotDB.connect())
{
return db.getContactsInTeam(this.getId());
}
}
public void addContact(Contact contact)
{
try (BergamotDB db = BergamotDB.connect())
{
db.addContactToTeam(this, contact);
}
}
public void removeContact(Contact contact)
{
try (BergamotDB db = BergamotDB.connect())
{
db.removeContactFromTeam(this, contact);
}
}
public List<String> getGrantedPermissions()
{
return grantedPermissions;
}
public void setGrantedPermissions(List<String> grantedPermissions)
{
this.grantedPermissions = grantedPermissions;
}
public List<String> getRevokedPermissions()
{
return revokedPermissions;
}
public void setRevokedPermissions(List<String> revokedPermissions)
{
this.revokedPermissions = revokedPermissions;
}
public List<AccessControl> getAccessControls()
{
try (BergamotDB db = BergamotDB.connect())
{
return db.getAccessControlsForRole(this.getId());
}
}
public AccessControl getAccessControl(SecurityDomain domain)
{
try (BergamotDB db = BergamotDB.connect())
{
return db.getAccessControl(domain.getId(), this.getId());
}
}
@Override
public TeamMO toMO(Contact contact, EnumSet<MOFlag> options)
{
TeamMO mo = new TeamMO();
super.toMO(mo, contact, options);
mo.setGrantedPermissions(this.getGrantedPermissions());
mo.setRevokedPermissions(this.getRevokedPermissions());
if (options.contains(MOFlag.TEAMS)) mo.setTeams(this.getTeams().stream().filter((x) -> contact == null || contact.hasPermission("read", x)).map((x) -> x.toStubMO(contact)).collect(Collectors.toList()));
if (options.contains(MOFlag.CHILDREN)) mo.setChildren(this.getChildren().stream().filter((x) -> contact == null || contact.hasPermission("read", x)).map((x) -> x.toStubMO(contact)).collect(Collectors.toList()));
if (options.contains(MOFlag.CONTACTS)) mo.setContacts(this.getContacts().stream().filter((x) -> contact == null || contact.hasPermission("read", x)).map((x) -> x.toStubMO(contact)).collect(Collectors.toList()));
return mo;
}
}