mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-28 21:16:13 +00:00
Add sharing functionality for SavedExport with users/groups
Introduced support for sharing SavedExport entities with individual users or groups. Added new collections, methods for adding/removing/viewing shares, and a migration to create relevant join tables in the database. This enhances collaboration by enabling flexible access control.
This commit is contained in:
parent
5e2d960a19
commit
35f5501489
@ -15,6 +15,9 @@ use Chill\MainBundle\Doctrine\Model\TrackCreationInterface;
|
|||||||
use Chill\MainBundle\Doctrine\Model\TrackCreationTrait;
|
use Chill\MainBundle\Doctrine\Model\TrackCreationTrait;
|
||||||
use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface;
|
use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface;
|
||||||
use Chill\MainBundle\Doctrine\Model\TrackUpdateTrait;
|
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 Doctrine\ORM\Mapping as ORM;
|
||||||
use Ramsey\Uuid\Uuid;
|
use Ramsey\Uuid\Uuid;
|
||||||
use Ramsey\Uuid\UuidInterface;
|
use Ramsey\Uuid\UuidInterface;
|
||||||
@ -50,9 +53,25 @@ class SavedExport implements TrackCreationInterface, TrackUpdateInterface
|
|||||||
#[ORM\ManyToOne(targetEntity: User::class)]
|
#[ORM\ManyToOne(targetEntity: User::class)]
|
||||||
private User $user;
|
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()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->id = Uuid::uuid4();
|
$this->id = Uuid::uuid4();
|
||||||
|
$this->sharedWithUsers = new ArrayCollection();
|
||||||
|
$this->sharedWithGroups = new ArrayCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDescription(): string
|
public function getDescription(): string
|
||||||
@ -119,4 +138,63 @@ class SavedExport implements TrackCreationInterface, TrackUpdateInterface
|
|||||||
|
|
||||||
return $this;
|
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(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\Migrations\Main;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
final class Version20250410145342 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return 'share saved_exports with users and groups';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql('CREATE TABLE chill_main_saved_export_users (savedexport_id UUID NOT NULL, user_id INT NOT NULL, PRIMARY KEY(savedexport_id, user_id))');
|
||||||
|
$this->addSql('CREATE INDEX IDX_4A2B71EC24ECEDCA ON chill_main_saved_export_users (savedexport_id)');
|
||||||
|
$this->addSql('CREATE INDEX IDX_4A2B71ECA76ED395 ON chill_main_saved_export_users (user_id)');
|
||||||
|
$this->addSql('COMMENT ON COLUMN chill_main_saved_export_users.savedexport_id IS \'(DC2Type:uuid)\'');
|
||||||
|
$this->addSql('CREATE TABLE chill_main_saved_export_usergroups (savedexport_id UUID NOT NULL, usergroup_id INT NOT NULL, PRIMARY KEY(savedexport_id, usergroup_id))');
|
||||||
|
$this->addSql('CREATE INDEX IDX_A12F30824ECEDCA ON chill_main_saved_export_usergroups (savedexport_id)');
|
||||||
|
$this->addSql('CREATE INDEX IDX_A12F308D2112630 ON chill_main_saved_export_usergroups (usergroup_id)');
|
||||||
|
$this->addSql('COMMENT ON COLUMN chill_main_saved_export_usergroups.savedexport_id IS \'(DC2Type:uuid)\'');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_users ADD CONSTRAINT FK_4A2B71EC24ECEDCA FOREIGN KEY (savedexport_id) REFERENCES chill_main_saved_export (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_users ADD CONSTRAINT FK_4A2B71ECA76ED395 FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_usergroups ADD CONSTRAINT FK_A12F30824ECEDCA FOREIGN KEY (savedexport_id) REFERENCES chill_main_saved_export (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_usergroups ADD CONSTRAINT FK_A12F308D2112630 FOREIGN KEY (usergroup_id) REFERENCES chill_main_user_group (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_users DROP CONSTRAINT FK_4A2B71EC24ECEDCA');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_users DROP CONSTRAINT FK_4A2B71ECA76ED395');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_usergroups DROP CONSTRAINT FK_A12F30824ECEDCA');
|
||||||
|
$this->addSql('ALTER TABLE chill_main_saved_export_usergroups DROP CONSTRAINT FK_A12F308D2112630');
|
||||||
|
$this->addSql('DROP TABLE chill_main_saved_export_users');
|
||||||
|
$this->addSql('DROP TABLE chill_main_saved_export_usergroups');
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user