Partage d'export enregistré et génération asynchrone des exports

This commit is contained in:
2025-07-08 13:53:25 +00:00
parent c4cc0baa8e
commit 8bc16dadb0
447 changed files with 14134 additions and 3854 deletions

View File

@@ -15,6 +15,9 @@ use Chill\MainBundle\Doctrine\Model\TrackCreationInterface;
use Chill\MainBundle\Doctrine\Model\TrackCreationTrait;
use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface;
use Chill\MainBundle\Doctrine\Model\TrackUpdateTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ReadableCollection;
use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Uuid;
use Ramsey\Uuid\UuidInterface;
@@ -50,9 +53,25 @@ class SavedExport implements TrackCreationInterface, TrackUpdateInterface
#[ORM\ManyToOne(targetEntity: User::class)]
private User $user;
/**
* @var Collection<int, User>
*/
#[ORM\ManyToMany(targetEntity: User::class)]
#[ORM\JoinTable(name: 'chill_main_saved_export_users')]
private Collection $sharedWithUsers;
/**
* @var Collection<int, UserGroup>
*/
#[ORM\ManyToMany(targetEntity: UserGroup::class)]
#[ORM\JoinTable(name: 'chill_main_saved_export_usergroups')]
private Collection $sharedWithGroups;
public function __construct()
{
$this->id = Uuid::uuid4();
$this->sharedWithUsers = new ArrayCollection();
$this->sharedWithGroups = new ArrayCollection();
}
public function getDescription(): string
@@ -119,4 +138,71 @@ class SavedExport implements TrackCreationInterface, TrackUpdateInterface
return $this;
}
public function addShare(User|UserGroup $shareUser): SavedExport
{
if ($shareUser instanceof User) {
if (!$this->sharedWithUsers->contains($shareUser)) {
$this->sharedWithUsers->add($shareUser);
}
} else {
if (!$this->sharedWithGroups->contains($shareUser)) {
$this->sharedWithGroups->add($shareUser);
}
}
return $this;
}
public function removeShare(User|UserGroup $shareUser): SavedExport
{
if ($shareUser instanceof User) {
$this->sharedWithUsers->removeElement($shareUser);
} else {
$this->sharedWithGroups->removeElement($shareUser);
}
return $this;
}
/**
* @return ReadableCollection<int, User|UserGroup>
*/
public function getShare(): ReadableCollection
{
return new ArrayCollection([
...$this->sharedWithUsers->toArray(),
...$this->sharedWithGroups->toArray(),
]);
}
/**
* Return true if shared with at least one user or one group.
*/
public function isShared(): bool
{
return $this->sharedWithUsers->count() > 0 || $this->sharedWithGroups->count() > 0;
}
/**
* Determines if the user is shared with either directly or through a group.
*
* @param User $user the user to check
*
* @return bool returns true if the user is shared with directly or via group, otherwise false
*/
public function isSharedWithUser(User $user): bool
{
if ($this->sharedWithUsers->contains($user)) {
return true;
}
foreach ($this->sharedWithGroups as $group) {
if ($group->contains($user)) {
return true;
}
}
return false;
}
}