improve team member handling (#3097)

This commit is contained in:
Kevin Papst
2022-01-25 13:44:49 +01:00
committed by GitHub
parent 8694a3bfe4
commit 1e269a6f82
8 changed files with 68 additions and 103 deletions

View File

@@ -579,12 +579,12 @@ class User implements UserInterface, EquatableInterface, \Serializable
throw new \InvalidArgumentException('Cannot set foreign user membership');
}
// when using the API an invalid user id does not trigger the validation first, but after calling this method :-(
// when using the API an invalid Team ID triggers the validation too late
if ($member->getTeam() === null) {
return;
}
if (null !== ($existing = $this->findMember($member))) {
if (null !== $this->findMemberByTeam($member->getTeam())) {
return;
}
@@ -592,33 +592,35 @@ class User implements UserInterface, EquatableInterface, \Serializable
$member->getTeam()->addMember($member);
}
private function findMemberByTeam(Team $team): ?TeamMember
{
foreach ($this->memberships as $member) {
if ($member->getTeam() === $team) {
return $member;
}
}
return null;
}
public function removeMembership(TeamMember $member): void
{
if (null === ($member = $this->findMember($member))) {
if (!$this->memberships->contains($member)) {
return;
}
$this->memberships->removeElement($member);
$member->getUser()->removeMembership($member);
$member->getTeam()->removeMember($member);
$member->setUser(null);
$member->setTeam(null);
}
/**
* Indexed by ID to use it within collection type forms.
*
* @return TeamMember[]
* @return Collection<TeamMember>
*/
public function getMemberships(): iterable
public function getMemberships(): Collection
{
$all = [];
foreach ($this->memberships as $member) {
if ($member->getId() === null) {
$all[] = $member;
} else {
$all[$member->getId()] = $member;
}
}
return $all;
return $this->memberships;
}
public function hasMembership(TeamMember $member): bool
@@ -626,17 +628,6 @@ class User implements UserInterface, EquatableInterface, \Serializable
return $this->memberships->contains($member);
}
private function findMember(TeamMember $member): ?TeamMember
{
foreach ($this->memberships as $oldMember) {
if ($oldMember->getUser() === $member->getUser() && $oldMember->getTeam() === $member->getTeam()) {
return $oldMember;
}
}
return null;
}
/**
* Checks if the user is member of any team.
*
@@ -750,10 +741,8 @@ class User implements UserInterface, EquatableInterface, \Serializable
public function isTeamleadOf(Team $team): bool
{
foreach ($this->memberships as $membership) {
if ($membership->getTeam() === $team) {
return $membership->isTeamlead();
}
if (null !== ($member = $this->findMemberByTeam($team))) {
return $member->isTeamlead();
}
return false;
@@ -830,10 +819,7 @@ class User implements UserInterface, EquatableInterface, \Serializable
return $this->auth === null || $this->auth === self::AUTH_INTERNAL;
}
/**
* {@inheritdoc}
*/
public function addRole($role)
public function addRole(string $role)
{
$role = strtoupper($role);
if ($role === static::DEFAULT_ROLE) {