Parcourir la source

created by for entities

master
Daniel il y a 1 an
Parent
révision
52e2dbe951
37 fichiers modifiés avec 228 ajouts et 83 suppressions
  1. +1
    -1
      migrations/Version20240328095507.php
  2. +3
    -3
      src/ApiResource/CommentApi.php
  3. +15
    -7
      src/ApiResource/ContactApi.php
  4. +9
    -9
      src/ApiResource/DocumentApi.php
  5. +11
    -5
      src/ApiResource/PartnerApi.php
  6. +3
    -3
      src/ApiResource/PostingApi.php
  7. +11
    -5
      src/ApiResource/ProductApi.php
  8. +3
    -3
      src/ApiResource/SaleApi.php
  9. +3
    -3
      src/ApiResource/TaskApi.php
  10. +3
    -3
      src/ApiResource/TaskNoteApi.php
  11. +3
    -3
      src/ApiResource/UserApi.php
  12. +4
    -1
      src/Controller/CreateDocumentObjectAction.php
  13. +4
    -1
      src/Controller/CreateMediaObjectAction.php
  14. +31
    -9
      src/DataFixtures/AppFixtures.php
  15. +15
    -1
      src/Entity/Contact.php
  16. +10
    -1
      src/Entity/DocumentObject.php
  17. +10
    -1
      src/Entity/MediaObject.php
  18. +14
    -6
      src/Entity/Partner.php
  19. +10
    -1
      src/Entity/Product.php
  20. +2
    -1
      src/Factory/ContactFactory.php
  21. +1
    -0
      src/Factory/DocumentObjectFactory.php
  22. +2
    -1
      src/Factory/MediaObjectContactFactory.php
  23. +2
    -1
      src/Factory/MediaObjectLogoFactory.php
  24. +2
    -1
      src/Factory/MediaObjectProductFactory.php
  25. +2
    -1
      src/Factory/MediaObjectUserFactory.php
  26. +1
    -0
      src/Factory/PartnerFactory.php
  27. +1
    -0
      src/Factory/ProductFactory.php
  28. +1
    -1
      src/Factory/TaskFactory.php
  29. +0
    -1
      src/Factory/UserFactory.php
  30. +5
    -1
      src/Mapper/ContactApiToEntityMapper.php
  31. +5
    -0
      src/Mapper/ContactEntityToApiMapper.php
  32. +5
    -4
      src/Mapper/DocumentEntityToApiMapper.php
  33. +10
    -2
      src/Mapper/PartnerApiToEntityMapper.php
  34. +5
    -0
      src/Mapper/PartnerEntityToApiMapper.php
  35. +14
    -3
      src/Mapper/ProductApiToEntityMapper.php
  36. +7
    -0
      src/Mapper/ProductEntityToApiMapper.php
  37. BIN
      tests/fixtures/1176_upload.png

migrations/Version20240327103616.php → migrations/Version20240328095507.php Voir le fichier

@@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
/** /**
* Auto-generated Migration: Please modify to your needs! * Auto-generated Migration: Please modify to your needs!
*/ */
final class Version20240327103616 extends AbstractMigration
final class Version20240328095507 extends AbstractMigration
{ {
public function getDescription(): string public function getDescription(): string
{ {

+ 3
- 3
src/ApiResource/CommentApi.php Voir le fichier

@@ -40,9 +40,9 @@ use Symfony\Component\Validator\Constraints\NotBlank;
new Patch( new Patch(
security: 'is_granted("EDIT", object)', security: 'is_granted("EDIT", object)',
), ),
new Delete(
security: 'is_granted("ROLE_ADMIN")',
)
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
provider: EntityToDtoStateProvider::class, provider: EntityToDtoStateProvider::class,


+ 15
- 7
src/ApiResource/ContactApi.php Voir le fichier

@@ -28,18 +28,20 @@ use Symfony\Component\Validator\Constraints\NotBlank;
shortName: 'Contact', shortName: 'Contact',
operations: [ operations: [
new Get( new Get(
security: 'is_granted("ROLE_USER")'
),
new GetCollection(),
new Post(
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
), ),
new Patch(
new GetCollection(
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
), ),
new Delete(
new Post(
security: 'is_granted("ROLE_ADMIN")',
),
new Patch(
security: 'is_granted("ROLE_ADMIN")', security: 'is_granted("ROLE_ADMIN")',
)
),
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
order: ['lastName' => 'ASC'], order: ['lastName' => 'ASC'],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
@@ -82,6 +84,12 @@ class ContactApi
#[ApiProperty(writable: false)] #[ApiProperty(writable: false)]
public array $posts = []; public array $posts = [];


#[ApiProperty(writable: false)]
public ?UserApi $createdBy = null;

#[ApiProperty(writable: false)]
public ?string $createdByName = null;

#[ApiProperty(writable: false)] #[ApiProperty(writable: false)]
public ?\DateTimeImmutable $createdAt = null; public ?\DateTimeImmutable $createdAt = null;
} }

+ 9
- 9
src/ApiResource/DocumentApi.php Voir le fichier

@@ -43,9 +43,9 @@ use Symfony\Component\Validator\Constraints\NotBlank;
new Patch( new Patch(
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
), ),
new Delete(
security: 'is_granted("ROLE_ADMIN")',
)
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
provider: EntityToDtoStateProvider::class, provider: EntityToDtoStateProvider::class,
@@ -58,12 +58,6 @@ class DocumentApi
#[ApiProperty(readable: false, writable: false, identifier: true)] #[ApiProperty(readable: false, writable: false, identifier: true)]
public ?int $id = null; public ?int $id = null;


#[ApiProperty(writable: false)]
public ?UserApi $createdBy = null;

#[ApiProperty(writable: false)]
public ?string $createdByName = null;

#[NotBlank] #[NotBlank]
public ?string $name = null; public ?string $name = null;


@@ -85,6 +79,12 @@ class DocumentApi
#[ApiProperty(writable: false)] #[ApiProperty(writable: false)]
public ?string $documentUrl = null; public ?string $documentUrl = null;


#[ApiProperty(writable: false)]
public ?UserApi $createdBy = null;

#[ApiProperty(writable: false)]
public ?string $createdByName = null;

#[ApiProperty(writable: false)] #[ApiProperty(writable: false)]
public ?\DateTimeImmutable $createdAt = null; public ?\DateTimeImmutable $createdAt = null;
} }

+ 11
- 5
src/ApiResource/PartnerApi.php Voir le fichier

@@ -34,14 +34,14 @@ use Symfony\Component\Validator\Constraints\NotBlank;
), ),
new GetCollection(), new GetCollection(),
new Post( new Post(
security: 'is_granted("ROLE_USER")',
security: 'is_granted("ROLE_ADMIN")',
), ),
new Patch( new Patch(
security: 'is_granted("ROLE_USER")',
),
new Delete(
security: 'is_granted("ROLE_ADMIN")', security: 'is_granted("ROLE_ADMIN")',
)
),
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
order: ['name' => 'ASC'], order: ['name' => 'ASC'],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
@@ -81,6 +81,12 @@ class PartnerApi
#[ApiProperty(writable: false)] #[ApiProperty(writable: false)]
public ?string $logoUrl = null; public ?string $logoUrl = null;


#[ApiProperty(writable: false)]
public ?UserApi $createdBy = null;

#[ApiProperty(writable: false)]
public ?string $createdByName = null;

#[ApiProperty(writable: false)] #[ApiProperty(writable: false)]
public ?\DateTimeImmutable $createdAt = null; public ?\DateTimeImmutable $createdAt = null;




+ 3
- 3
src/ApiResource/PostingApi.php Voir le fichier

@@ -44,9 +44,9 @@ use Symfony\Component\Validator\Constraints\NotBlank;
denormalizationContext: ['groups' => 'posting:patch'], denormalizationContext: ['groups' => 'posting:patch'],
security: 'is_granted("EDIT", object)', security: 'is_granted("EDIT", object)',
), ),
new Delete(
security: 'is_granted("ROLE_ADMIN")',
)
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
order: ['createdAt' => 'DESC'], order: ['createdAt' => 'DESC'],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',


+ 11
- 5
src/ApiResource/ProductApi.php Voir le fichier

@@ -33,14 +33,14 @@ use Symfony\Component\Validator\Constraints\NotBlank;
), ),
new GetCollection(), new GetCollection(),
new Post( new Post(
security: 'is_granted("ROLE_USER")',
security: 'is_granted("ROLE_ADMIN")',
), ),
new Patch( new Patch(
security: 'is_granted("ROLE_USER")',
),
new Delete(
security: 'is_granted("ROLE_ADMIN")', security: 'is_granted("ROLE_ADMIN")',
)
),
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
order: ['name' => 'ASC'], order: ['name' => 'ASC'],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
@@ -66,6 +66,12 @@ class ProductApi
#[ApiProperty(writable: false)] #[ApiProperty(writable: false)]
public ?string $imageUrl = null; public ?string $imageUrl = null;


#[ApiProperty(writable: false)]
public ?UserApi $createdBy = null;

#[ApiProperty(writable: false)]
public ?string $createdByName = null;

public ?\DateTimeImmutable $createdAt = null; public ?\DateTimeImmutable $createdAt = null;


} }

+ 3
- 3
src/ApiResource/SaleApi.php Voir le fichier

@@ -37,9 +37,9 @@ use Symfony\Component\Validator\Constraints\NotBlank;
new Patch( new Patch(
security: 'is_granted("EDIT", object)', security: 'is_granted("EDIT", object)',
), ),
new Delete(
security: 'is_granted("ROLE_ADMIN")',
)
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
order: ['createdAt' => 'DESC'], order: ['createdAt' => 'DESC'],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',


+ 3
- 3
src/ApiResource/TaskApi.php Voir le fichier

@@ -40,9 +40,9 @@ use Symfony\Component\Validator\Constraints as Assert;
new Patch( new Patch(
security: 'is_granted("ROLE_USER")' security: 'is_granted("ROLE_USER")'
), ),
new Delete(
security: 'is_granted("ROLE_USER")',
)
// new Delete(
// security: 'is_granted("ROLE_USER")',
// )
], ],
order: ['dueAt' => 'DESC'], order: ['dueAt' => 'DESC'],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',


+ 3
- 3
src/ApiResource/TaskNoteApi.php Voir le fichier

@@ -36,9 +36,9 @@ use Symfony\Component\Validator\Constraints\NotBlank;
new Patch( new Patch(
security: 'is_granted("EDIT", object)', security: 'is_granted("EDIT", object)',
), ),
new Delete(
security: 'is_granted("ROLE_ADMIN")',
)
// new Delete(
// security: 'is_granted("ROLE_ADMIN")',
// )
], ],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
provider: EntityToDtoStateProvider::class, provider: EntityToDtoStateProvider::class,


+ 3
- 3
src/ApiResource/UserApi.php Voir le fichier

@@ -36,9 +36,9 @@ use Symfony\Component\Validator\Constraints as Assert;
security: 'is_granted("ROLE_ADMIN")', security: 'is_granted("ROLE_ADMIN")',
validationContext: ['groups' => ['Default', 'postValidation']] validationContext: ['groups' => ['Default', 'postValidation']]
), ),
new Patch(
security: 'is_granted("is_granted("EDIT", object)")'
),
// new Patch(
// security: 'is_granted("is_granted("EDIT", object)")'
// ),
], ],
security: 'is_granted("ROLE_USER")', security: 'is_granted("ROLE_USER")',
provider: EntityToDtoStateProvider::class, provider: EntityToDtoStateProvider::class,


+ 4
- 1
src/Controller/CreateDocumentObjectAction.php Voir le fichier

@@ -9,6 +9,7 @@ namespace App\Controller;




use App\Entity\DocumentObject; use App\Entity\DocumentObject;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\AsController; use Symfony\Component\HttpKernel\Attribute\AsController;
@@ -24,7 +25,9 @@ final class CreateDocumentObjectAction extends AbstractController
throw new BadRequestHttpException('"file" is required'); throw new BadRequestHttpException('"file" is required');
} }


$mediaObject = new DocumentObject();
$user = $this->getUser();
assert($user instanceof User);
$mediaObject = new DocumentObject($user);
$mediaObject->file = $uploadedFile; $mediaObject->file = $uploadedFile;


return $mediaObject; return $mediaObject;


+ 4
- 1
src/Controller/CreateMediaObjectAction.php Voir le fichier

@@ -9,6 +9,7 @@ namespace App\Controller;




use App\Entity\MediaObject; use App\Entity\MediaObject;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\AsController; use Symfony\Component\HttpKernel\Attribute\AsController;
@@ -24,7 +25,9 @@ final class CreateMediaObjectAction extends AbstractController
throw new BadRequestHttpException('"file" is required'); throw new BadRequestHttpException('"file" is required');
} }


$mediaObject = new MediaObject();
$user = $this->getUser();
assert($user instanceof User);
$mediaObject = new MediaObject($user);
$mediaObject->file = $uploadedFile; $mediaObject->file = $uploadedFile;


return $mediaObject; return $mediaObject;


+ 31
- 9
src/DataFixtures/AppFixtures.php Voir le fichier

@@ -52,7 +52,7 @@ class AppFixtures extends Fixture
} }
} }


MediaObjectUserFactory::createMany(20);
$adminD = UserFactory::createOne( $adminD = UserFactory::createOne(
[ [
'email' => 'd.knudsen@spawntree.de', 'email' => 'd.knudsen@spawntree.de',
@@ -62,6 +62,12 @@ class AppFixtures extends Fixture
] ]
); );
$adminD->setRoles(['ROLE_ADMIN']); $adminD->setRoles(['ROLE_ADMIN']);
MediaObjectUserFactory::createMany(20);
MediaObjectLogoFactory::createMany(50);
MediaObjectContactFactory::createMany(50);
MediaObjectProductFactory::createMany(50);
DocumentObjectFactory::createMany(50);
$adminD->setImage(MediaObjectUserFactory::random()->object());


$adminF = UserFactory::createOne( $adminF = UserFactory::createOne(
[ [
@@ -69,24 +75,40 @@ class AppFixtures extends Fixture
'firstName' => 'Florian', 'firstName' => 'Florian',
'lastName' => 'Eisenmenger', 'lastName' => 'Eisenmenger',
'password' => 'test', 'password' => 'test',
'image' => MediaObjectUserFactory::random()
] ]
); );
$adminF->setRoles(['ROLE_ADMIN']); $adminF->setRoles(['ROLE_ADMIN']);


UserFactory::createMany(10);
MediaObjectLogoFactory::createMany(50);
PartnerFactory::createMany(100);
MediaObjectContactFactory::createMany(50);
ContactFactory::createMany(200);
ProductFactory::createMany(100);
UserFactory::createMany(10,
[
'image' => MediaObjectUserFactory::random()
]
);

PartnerFactory::createMany(100,
[
'createdBy' => $adminD
]
);

ContactFactory::createMany(200,
[
'createdBy' => $adminD
]
);

ProductFactory::createMany(100,
[
'createdBy' => $adminD
]
);
SaleFactory::createMany(50); SaleFactory::createMany(50);
PostingFactory::createMany(200); PostingFactory::createMany(200);
CommentFactory::createMany(300); CommentFactory::createMany(300);
MediaObjectProductFactory::createMany(50);
TaskFactory::createMany(50); TaskFactory::createMany(50);
TaskNoteFactory::createMany(100); TaskNoteFactory::createMany(100);
PartnerFollowFactory::createMany(100); PartnerFollowFactory::createMany(100);
DocumentObjectFactory::createMany(50);
DocumentFactory::createMany(50); DocumentFactory::createMany(50);
} }
} }

+ 15
- 1
src/Entity/Contact.php Voir le fichier

@@ -43,15 +43,19 @@ class Contact
#[ORM\Column(length: 255, nullable: true)] #[ORM\Column(length: 255, nullable: true)]
private ?string $email = null; private ?string $email = null;


#[ORM\JoinColumn(nullable: false)]
private ?User $createdBy = null;

#[ORM\Column] #[ORM\Column]
private ?\DateTimeImmutable $createdAt = null; private ?\DateTimeImmutable $createdAt = null;


#[ORM\OneToMany(mappedBy: 'contact', targetEntity: Posting::class)] #[ORM\OneToMany(mappedBy: 'contact', targetEntity: Posting::class)]
private Collection $posts; private Collection $posts;


public function __construct(Partner $partner)
public function __construct(Partner $partner, User $createdBy)
{ {
$this->partner = $partner; $this->partner = $partner;
$this->createdBy = $createdBy;
$this->createdAt = new \DateTimeImmutable(); $this->createdAt = new \DateTimeImmutable();
$this->posts = new ArrayCollection(); $this->posts = new ArrayCollection();
} }
@@ -153,6 +157,16 @@ class Contact
return $this; return $this;
} }


public function getCreatedBy(): ?User
{
return $this->createdBy;
}

public function setCreatedBy(?User $createdBy): void
{
$this->createdBy = $createdBy;
}

public function getCreatedAt(): ?\DateTimeImmutable public function getCreatedAt(): ?\DateTimeImmutable
{ {
return $this->createdAt; return $this->createdAt;


+ 10
- 1
src/Entity/DocumentObject.php Voir le fichier

@@ -72,11 +72,15 @@ class DocumentObject
#[ORM\Column(nullable: true)] #[ORM\Column(nullable: true)]
public ?string $filePath = null; public ?string $filePath = null;


#[ORM\JoinColumn(nullable: false)]
private ?User $createdBy = null;

#[ORM\Column] #[ORM\Column]
private ?\DateTimeImmutable $createdAt = null; private ?\DateTimeImmutable $createdAt = null;


public function __construct()
public function __construct(User $createdBy)
{ {
$this->createdBy = $createdBy;
$this->createdAt = new \DateTimeImmutable(); $this->createdAt = new \DateTimeImmutable();
} }


@@ -100,6 +104,11 @@ class DocumentObject
return $this->filePath; return $this->filePath;
} }


public function getCreatedBy(): ?User
{
return $this->createdBy;
}

public function getCreatedAt(): ?\DateTimeImmutable public function getCreatedAt(): ?\DateTimeImmutable
{ {
return $this->createdAt; return $this->createdAt;


+ 10
- 1
src/Entity/MediaObject.php Voir le fichier

@@ -72,11 +72,15 @@ class MediaObject
#[ORM\Column(nullable: true)] #[ORM\Column(nullable: true)]
public ?string $filePath = null; public ?string $filePath = null;


#[ORM\JoinColumn(nullable: false)]
private ?User $createdBy = null;

#[ORM\Column] #[ORM\Column]
private ?\DateTimeImmutable $createdAt = null; private ?\DateTimeImmutable $createdAt = null;


public function __construct()
public function __construct(User $createdBy)
{ {
$this->createdBy = $createdBy;
$this->createdAt = new \DateTimeImmutable(); $this->createdAt = new \DateTimeImmutable();
} }


@@ -100,6 +104,11 @@ class MediaObject
return $this->filePath; return $this->filePath;
} }


public function getCreatedBy(): ?User
{
return $this->createdBy;
}

public function getCreatedAt(): ?\DateTimeImmutable public function getCreatedAt(): ?\DateTimeImmutable
{ {
return $this->createdAt; return $this->createdAt;


+ 14
- 6
src/Entity/Partner.php Voir le fichier

@@ -44,17 +44,19 @@ class Partner
#[ORM\Column(length: 255, nullable: true)] #[ORM\Column(length: 255, nullable: true)]
private ?string $website = null; private ?string $website = null;


#[ORM\ManyToOne(targetEntity: MediaObject::class)]
#[ORM\JoinColumn(nullable: true, onDelete: "SET NULL")]
private ?MediaObject $logo = null;

#[ORM\JoinColumn(nullable: false)]
private ?User $createdBy = null;

#[ORM\Column] #[ORM\Column]
private ?\DateTimeImmutable $createdAt = null; private ?\DateTimeImmutable $createdAt = null;


#[ORM\OneToMany(mappedBy: 'partner', targetEntity: Contact::class)] #[ORM\OneToMany(mappedBy: 'partner', targetEntity: Contact::class)]
private Collection $contacts; private Collection $contacts;


#[ORM\ManyToOne(targetEntity: MediaObject::class)]
#[ORM\JoinColumn(nullable: true, onDelete: "SET NULL")]
private ?MediaObject $logo = null;

//#[ORM\OneToMany(mappedBy: 'partner', targetEntity: Posting::class, orphanRemoval: true)]
#[ORM\OneToMany(mappedBy: 'partner', targetEntity: Posting::class)] #[ORM\OneToMany(mappedBy: 'partner', targetEntity: Posting::class)]
private Collection $postings; private Collection $postings;


@@ -67,8 +69,9 @@ class Partner
#[ORM\OneToMany(mappedBy: 'partner', targetEntity: PartnerFollow::class)] #[ORM\OneToMany(mappedBy: 'partner', targetEntity: PartnerFollow::class)]
private Collection $partnerFollows; private Collection $partnerFollows;


public function __construct()
public function __construct(User $createdBy)
{ {
$this->createdBy = $createdBy;
$this->createdAt = new \DateTimeImmutable(); $this->createdAt = new \DateTimeImmutable();
$this->contacts = new ArrayCollection(); $this->contacts = new ArrayCollection();
$this->postings = new ArrayCollection(); $this->postings = new ArrayCollection();
@@ -177,6 +180,11 @@ class Partner
return $this->createdAt; return $this->createdAt;
} }


public function getCreatedBy(): ?User
{
return $this->createdBy;
}

public function setCreatedAt(?\DateTimeImmutable $createdAt): void public function setCreatedAt(?\DateTimeImmutable $createdAt): void
{ {
$this->createdAt = $createdAt; $this->createdAt = $createdAt;


+ 10
- 1
src/Entity/Product.php Voir le fichier

@@ -26,6 +26,9 @@ class Product
#[ORM\JoinColumn(nullable: true, onDelete: "SET NULL")] #[ORM\JoinColumn(nullable: true, onDelete: "SET NULL")]
private ?MediaObject $image = null; private ?MediaObject $image = null;


#[ORM\JoinColumn(nullable: false)]
private ?User $createdBy = null;

#[ORM\Column] #[ORM\Column]
private ?\DateTimeImmutable $createdAt = null; private ?\DateTimeImmutable $createdAt = null;


@@ -35,8 +38,9 @@ class Product
#[ORM\OneToMany(mappedBy: 'product', targetEntity: Document::class)] #[ORM\OneToMany(mappedBy: 'product', targetEntity: Document::class)]
private Collection $documentObjects; private Collection $documentObjects;


public function __construct()
public function __construct(User $createdBy)
{ {
$this->createdBy = $createdBy;
$this->createdAt = new \DateTimeImmutable(); $this->createdAt = new \DateTimeImmutable();
$this->sales = new ArrayCollection(); $this->sales = new ArrayCollection();
$this->documentObjects = new ArrayCollection(); $this->documentObjects = new ArrayCollection();
@@ -83,6 +87,11 @@ class Product
return $this; return $this;
} }


public function getCreatedBy(): ?User
{
return $this->createdBy;
}

public function getCreatedAt(): ?\DateTimeImmutable public function getCreatedAt(): ?\DateTimeImmutable
{ {
return $this->createdAt; return $this->createdAt;


+ 2
- 1
src/Factory/ContactFactory.php Voir le fichier

@@ -55,7 +55,8 @@ final class ContactFactory extends ModelFactory
'phone' => self::faker()->phoneNumber(), 'phone' => self::faker()->phoneNumber(),
'email' => self::faker()->email(), 'email' => self::faker()->email(),
'partner' => PartnerFactory::random(), 'partner' => PartnerFactory::random(),
'image' => MediaObjectContactFactory::random()
'image' => MediaObjectContactFactory::random(),
'createdBy' => UserFactory::random()
]; ];
} }




+ 1
- 0
src/Factory/DocumentObjectFactory.php Voir le fichier

@@ -62,6 +62,7 @@ final class DocumentObjectFactory extends ModelFactory
$randBool = (bool)random_int(0, 1); $randBool = (bool)random_int(0, 1);
return [ return [
'file' => new ReplacingFile($randomFile), 'file' => new ReplacingFile($randomFile),
'createdBy' => UserFactory::random()
]; ];
} }




+ 2
- 1
src/Factory/MediaObjectContactFactory.php Voir le fichier

@@ -62,7 +62,8 @@ final class MediaObjectContactFactory extends ModelFactory
} }


return [ return [
'file' => new ReplacingFile($randomFile)
'file' => new ReplacingFile($randomFile),
'createdBy' => UserFactory::random()
]; ];
} }




+ 2
- 1
src/Factory/MediaObjectLogoFactory.php Voir le fichier

@@ -62,7 +62,8 @@ final class MediaObjectLogoFactory extends ModelFactory
} }


return [ return [
'file' => new ReplacingFile($randomFile)
'file' => new ReplacingFile($randomFile),
'createdBy' => UserFactory::random()
]; ];
} }




+ 2
- 1
src/Factory/MediaObjectProductFactory.php Voir le fichier

@@ -62,7 +62,8 @@ final class MediaObjectProductFactory extends ModelFactory
} }


return [ return [
'file' => new ReplacingFile($randomFile)
'file' => new ReplacingFile($randomFile),
'createdBy' => UserFactory::random()
]; ];
} }




+ 2
- 1
src/Factory/MediaObjectUserFactory.php Voir le fichier

@@ -62,7 +62,8 @@ final class MediaObjectUserFactory extends ModelFactory
} }


return [ return [
'file' => new ReplacingFile($randomFile)
'file' => new ReplacingFile($randomFile),
'createdBy' => UserFactory::random()
]; ];
} }




+ 1
- 0
src/Factory/PartnerFactory.php Voir le fichier

@@ -60,6 +60,7 @@ final class PartnerFactory extends ModelFactory
'country' => self::faker()->randomElement(FakeValues::COUNTRIES), 'country' => self::faker()->randomElement(FakeValues::COUNTRIES),
'logo' => MediaObjectLogoFactory::random(), 'logo' => MediaObjectLogoFactory::random(),
'website' => 'https://spawntree.de/', 'website' => 'https://spawntree.de/',
'createdBy' => UserFactory::random()
]; ];
} }




+ 1
- 0
src/Factory/ProductFactory.php Voir le fichier

@@ -51,6 +51,7 @@ final class ProductFactory extends ModelFactory
'name' => self::faker()->randomElement(FakeValues::PRODUCTS), 'name' => self::faker()->randomElement(FakeValues::PRODUCTS),
'description' => self::faker()->text(), 'description' => self::faker()->text(),
'image' => MediaObjectProductFactory::createOne(), 'image' => MediaObjectProductFactory::createOne(),
'createdBy' => UserFactory::random()
]; ];
} }




+ 1
- 1
src/Factory/TaskFactory.php Voir le fichier

@@ -52,7 +52,7 @@ final class TaskFactory extends ModelFactory
return [ return [
'headline' => self::faker()->randomElement(FakeValues::TASKS), 'headline' => self::faker()->randomElement(FakeValues::TASKS),
'description' => self::faker()->sentence(), 'description' => self::faker()->sentence(),
'createdBy' => UserFactory::new(),
'createdBy' => UserFactory::random(),
'assignedTo' => UserFactory::random(), 'assignedTo' => UserFactory::random(),
'partner' => PartnerFactory::random(), 'partner' => PartnerFactory::random(),
'contact' => $randomBoolean ? ContactFactory::random() : null, 'contact' => $randomBoolean ? ContactFactory::random() : null,


+ 0
- 1
src/Factory/UserFactory.php Voir le fichier

@@ -52,7 +52,6 @@ final class UserFactory extends ModelFactory
'email' => self::faker()->email(), 'email' => self::faker()->email(),
'firstName' => self::faker()->firstName(), 'firstName' => self::faker()->firstName(),
'lastName' => self::faker()->lastName(), 'lastName' => self::faker()->lastName(),
'image' => MediaObjectUserFactory::random(),
'password' => "test", 'password' => "test",
'roles' => [], 'roles' => [],
]; ];


+ 5
- 1
src/Mapper/ContactApiToEntityMapper.php Voir le fichier

@@ -5,6 +5,7 @@ namespace App\Mapper;
use App\ApiResource\ContactApi; use App\ApiResource\ContactApi;
use App\Entity\Contact; use App\Entity\Contact;
use App\Entity\Partner; use App\Entity\Partner;
use App\Entity\User;
use App\Repository\ContactRepository; use App\Repository\ContactRepository;
use App\Repository\PartnerRepository; use App\Repository\PartnerRepository;
use Symfony\Bundle\SecurityBundle\Security; use Symfony\Bundle\SecurityBundle\Security;
@@ -17,6 +18,7 @@ class ContactApiToEntityMapper implements MapperInterface
{ {
public function __construct( public function __construct(
private ContactRepository $repository, private ContactRepository $repository,
private Security $security,
private MicroMapperInterface $microMapper, private MicroMapperInterface $microMapper,
) )
{ {
@@ -31,13 +33,15 @@ class ContactApiToEntityMapper implements MapperInterface
if ($dto->id) { if ($dto->id) {
$entity = $this->repository->find($dto->id); $entity = $this->repository->find($dto->id);
} else { } else {
$user = $this->security->getUser();
assert($user instanceof User);
if ($dto->partner === null) { if ($dto->partner === null) {
throw new \Exception('Partner missing'); throw new \Exception('Partner missing');
} }
$partner = $this->microMapper->map($dto->partner, Partner::class, [ $partner = $this->microMapper->map($dto->partner, Partner::class, [
MicroMapperInterface::MAX_DEPTH => 1, MicroMapperInterface::MAX_DEPTH => 1,
]); ]);
$entity = new Contact($partner);
$entity = new Contact($partner, $user);
} }






+ 5
- 0
src/Mapper/ContactEntityToApiMapper.php Voir le fichier

@@ -5,6 +5,7 @@ namespace App\Mapper;
use App\ApiResource\ContactApi; use App\ApiResource\ContactApi;
use App\ApiResource\PartnerApi; use App\ApiResource\PartnerApi;
use App\ApiResource\PostingApi; use App\ApiResource\PostingApi;
use App\ApiResource\UserApi;
use App\Entity\Contact; use App\Entity\Contact;
use App\Entity\Posting; use App\Entity\Posting;
use App\Service\FileUrlService; use App\Service\FileUrlService;
@@ -53,6 +54,10 @@ class ContactEntityToApiMapper implements MapperInterface
$dto->position = $entity->getPosition(); $dto->position = $entity->getPosition();
$dto->phone = $entity->getPhone(); $dto->phone = $entity->getPhone();
$dto->email = $entity->getEmail(); $dto->email = $entity->getEmail();
$dto->createdBy = $this->microMapper->map($entity->getCreatedBy(), UserApi::class, [
MicroMapperInterface::MAX_DEPTH => 1,
]);
$dto->createdByName = $entity->getCreatedBy()?->getFirstName() . ' ' . $entity->getCreatedBy()?->getLastName();
$dto->createdAt = $entity->getCreatedAt(); $dto->createdAt = $entity->getCreatedAt();


$dto->posts = array_map(function(Posting $posting) { $dto->posts = array_map(function(Posting $posting) {


+ 5
- 4
src/Mapper/DocumentEntityToApiMapper.php Voir le fichier

@@ -43,10 +43,6 @@ class DocumentEntityToApiMapper implements MapperInterface
assert($entity instanceof Document); assert($entity instanceof Document);
assert($dto instanceof DocumentApi); assert($dto instanceof DocumentApi);


$dto->createdBy = $this->microMapper->map($entity->getCreatedBy(), UserApi::class, [
MicroMapperInterface::MAX_DEPTH => 1,
]);
$dto->createdByName = $entity->getCreatedBy()?->getFirstName() . ' ' . $entity->getCreatedBy()?->getLastName();
$dto->name = $entity->getName(); $dto->name = $entity->getName();
$dto->description = $entity->getDescription(); $dto->description = $entity->getDescription();


@@ -66,6 +62,11 @@ class DocumentEntityToApiMapper implements MapperInterface


$dto->documentObject = $entity->getDocumentObject(); $dto->documentObject = $entity->getDocumentObject();
$dto->documentUrl = $this->fileUrlService->getFileUrl($entity->getDocumentObject()); $dto->documentUrl = $this->fileUrlService->getFileUrl($entity->getDocumentObject());

$dto->createdBy = $this->microMapper->map($entity->getCreatedBy(), UserApi::class, [
MicroMapperInterface::MAX_DEPTH => 1,
]);
$dto->createdByName = $entity->getCreatedBy()?->getFirstName() . ' ' . $entity->getCreatedBy()?->getLastName();
$dto->createdAt = $entity->getCreatedAt(); $dto->createdAt = $entity->getCreatedAt();


return $dto; return $dto;


+ 10
- 2
src/Mapper/PartnerApiToEntityMapper.php Voir le fichier

@@ -19,7 +19,8 @@ use Symfonycasts\MicroMapper\MicroMapperInterface;
class PartnerApiToEntityMapper implements MapperInterface class PartnerApiToEntityMapper implements MapperInterface
{ {
public function __construct( public function __construct(
private PartnerRepository $repository
private PartnerRepository $repository,
private Security $security,
) )
{ {


@@ -30,7 +31,14 @@ class PartnerApiToEntityMapper implements MapperInterface
$dto = $from; $dto = $from;
assert($dto instanceof PartnerApi); assert($dto instanceof PartnerApi);


$entity = $dto->id ? $this->repository->find($dto->id) : new Partner();
if ($dto->id) {
$entity = $this->repository->find($dto->id);
} else {
$user = $this->security->getUser();
assert($user instanceof User);
$entity = new Partner($user);
}

if (!$entity) { if (!$entity) {
throw new \Exception('Partner not found'); throw new \Exception('Partner not found');
} }


+ 5
- 0
src/Mapper/PartnerEntityToApiMapper.php Voir le fichier

@@ -5,6 +5,7 @@ namespace App\Mapper;
use App\ApiResource\ContactApi; use App\ApiResource\ContactApi;
use App\ApiResource\PartnerApi; use App\ApiResource\PartnerApi;
use App\ApiResource\PostingApi; use App\ApiResource\PostingApi;
use App\ApiResource\UserApi;
use App\Entity\Contact; use App\Entity\Contact;
use App\Entity\Partner; use App\Entity\Partner;
use App\Entity\Posting; use App\Entity\Posting;
@@ -52,6 +53,10 @@ class PartnerEntityToApiMapper implements MapperInterface
$dto->website = $entity->getWebsite(); $dto->website = $entity->getWebsite();
$dto->logo = $entity->getLogo(); $dto->logo = $entity->getLogo();
$dto->logoUrl = $this->fileUrlService->getFileUrl($entity->getLogo()); $dto->logoUrl = $this->fileUrlService->getFileUrl($entity->getLogo());
$dto->createdBy = $this->microMapper->map($entity->getCreatedBy(), UserApi::class, [
MicroMapperInterface::MAX_DEPTH => 1,
]);
$dto->createdByName = $entity->getCreatedBy()?->getFirstName() . ' ' . $entity->getCreatedBy()?->getLastName();
$dto->createdAt = $entity->getCreatedAt(); $dto->createdAt = $entity->getCreatedAt();
$dto->posts = array_map(function(Posting $posting) { $dto->posts = array_map(function(Posting $posting) {
return $this->microMapper->map($posting, PostingApi::class, [ return $this->microMapper->map($posting, PostingApi::class, [


+ 14
- 3
src/Mapper/ProductApiToEntityMapper.php Voir le fichier

@@ -4,15 +4,19 @@ namespace App\Mapper;


use App\ApiResource\ProductApi; use App\ApiResource\ProductApi;
use App\Entity\Product; use App\Entity\Product;
use App\Entity\User;
use App\Repository\ProductRepository; use App\Repository\ProductRepository;
use Symfony\Bundle\SecurityBundle\Security;
use Symfonycasts\MicroMapper\AsMapper; use Symfonycasts\MicroMapper\AsMapper;
use Symfonycasts\MicroMapper\MapperInterface; use Symfonycasts\MicroMapper\MapperInterface;
use Symfonycasts\MicroMapper\MicroMapperInterface;


#[AsMapper(from: ProductApi::class, to: Product::class)] #[AsMapper(from: ProductApi::class, to: Product::class)]
class ProductApiToEntityMapper implements MapperInterface class ProductApiToEntityMapper implements MapperInterface
{ {
public function __construct( public function __construct(
private ProductRepository $repository
private ProductRepository $repository,
private Security $security,
) )
{ {


@@ -23,9 +27,16 @@ class ProductApiToEntityMapper implements MapperInterface
$dto = $from; $dto = $from;
assert($dto instanceof ProductApi); assert($dto instanceof ProductApi);


$entity = $dto->id ? $this->repository->find($dto->id) : new Product();
if ($dto->id) {
$entity = $this->repository->find($dto->id);
} else {
$user = $this->security->getUser();
assert($user instanceof User);
$entity = new Product($user);
}

if (!$entity) { if (!$entity) {
throw new \Exception('Product not found');
throw new \Exception('Partner not found');
} }


return $entity; return $entity;


+ 7
- 0
src/Mapper/ProductEntityToApiMapper.php Voir le fichier

@@ -3,15 +3,18 @@
namespace App\Mapper; namespace App\Mapper;


use App\ApiResource\ProductApi; use App\ApiResource\ProductApi;
use App\ApiResource\UserApi;
use App\Entity\Product; use App\Entity\Product;
use App\Service\FileUrlService; use App\Service\FileUrlService;
use Symfonycasts\MicroMapper\AsMapper; use Symfonycasts\MicroMapper\AsMapper;
use Symfonycasts\MicroMapper\MapperInterface; use Symfonycasts\MicroMapper\MapperInterface;
use Symfonycasts\MicroMapper\MicroMapperInterface;


#[AsMapper(from: Product::class, to: ProductApi::class)] #[AsMapper(from: Product::class, to: ProductApi::class)]
class ProductEntityToApiMapper implements MapperInterface class ProductEntityToApiMapper implements MapperInterface
{ {
public function __construct( public function __construct(
private MicroMapperInterface $microMapper,
private FileUrlService $fileUrlService private FileUrlService $fileUrlService
) { ) {
} }
@@ -38,6 +41,10 @@ class ProductEntityToApiMapper implements MapperInterface
$dto->description = $entity->getDescription(); $dto->description = $entity->getDescription();
$dto->image = $entity->getImage(); $dto->image = $entity->getImage();
$dto->imageUrl = $this->fileUrlService->getFileUrl($entity->getImage()); $dto->imageUrl = $this->fileUrlService->getFileUrl($entity->getImage());
$dto->createdBy = $this->microMapper->map($entity->getCreatedBy(), UserApi::class, [
MicroMapperInterface::MAX_DEPTH => 1,
]);
$dto->createdByName = $entity->getCreatedBy()?->getFirstName() . ' ' . $entity->getCreatedBy()?->getLastName();
return $dto; return $dto;
} }
} }

BIN
tests/fixtures/1176_upload.png Voir le fichier

Avant Après
Largeur: 256  |  Hauteur: 256  |  Taille: 3.9 KiB

Chargement…
Annuler
Enregistrer