<?php 
 
namespace App\Entity; 
 
use ApiPlatform\Metadata\ApiResource; 
use ApiPlatform\Metadata\Delete; 
use ApiPlatform\Metadata\Get; 
use ApiPlatform\Metadata\GetCollection; 
use ApiPlatform\Metadata\Post; 
use ApiPlatform\Metadata\Put; 
use App\Controller\Action\MessageFilePostController; 
use App\Repository\FileRepository; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Serializer\Annotation\Groups; 
 
#[ORM\Entity(repositoryClass: FileRepository::class)] 
#[ApiResource( 
    operations: [ 
        new Post( 
            uriTemplate: 'message_files/upload', 
            controller: MessageFilePostController::class, 
            openapiContext: [ 
                'requestBody' => [ 
                    'content' => [ 
                        'multipart/form-data' => [ 
                            'schema' => [ 
                                'type' => 'object', 
                                'properties' => [ 
                                    'type' => [ 
                                        'type' => 'string', 
                                        'format' => 'string' 
                                    ], 
                                    'name' => [ 
                                        'type' => 'string', 
                                        'format' => 'string' 
                                    ], 
                                    'size' => [ 
                                        'type' => 'int', 
                                        'format' => 'int' 
                                    ], 
                                    'file' => [ 
                                        'type' => 'string', 
                                        'format' => 'binary' 
                                    ], 
                                ] 
                            ] 
                        ] 
                    ] 
                ] 
            ], 
            deserialize: false, 
            validate: false, 
            name: '_api_/message_files/upload' 
        ), 
    ], 
    normalizationContext: ['groups' => ['messageFile.get','message.get']], 
    denormalizationContext: ['groups' => ['messageFile.write']] 
)] 
class MessageFile 
{ 
    #[ORM\Id] 
    #[ORM\GeneratedValue] 
    #[ORM\Column] 
    #[Groups(['messageFile.write','messageFile.get','message.get'])] 
    private ?int $id = null; 
 
    #[ORM\Column(type: "string", length: 255)] 
    #[Groups(['messageFile.write','messageFile.get','message.get'])] 
    private string $name; 
 
    #[ORM\Column(type: "string", length: 255)] 
    #[Groups(['messageFile.write','messageFile.get'])] 
    private string $type; 
 
    #[ORM\Column(type: "integer")] 
    #[Groups(['messageFile.write','messageFile.get'])] 
    private int $size; 
 
    #[ORM\Column(length: 255, nullable: true)] 
    #[Groups(['messageFile.write','messageFile.get'])] 
    private ?string $file = null; 
 
    #[ORM\Column(length: 255, nullable: true)] 
    #[Groups(['messageFile.write','messageFile.get'])] 
    private ?string $path = null; 
 
    #[ORM\Column(type: "datetime")] 
    #[Groups(['messageFile.write','messageFile.get'])] 
    private \DateTimeInterface $createdAt; 
 
    #[ORM\ManyToOne(inversedBy: 'messageFiles')] 
    #[Groups(['messageFile.write','messageFile.get'])] 
    private ?Message $message = null; 
 
    public function __construct(string $name, string $type, int $size) 
    { 
        $this->name = $name; 
        $this->type = $type; 
        $this->size = $size; 
        $this->createdAt = new \DateTimeImmutable(); 
    } 
 
    public function getId(): int 
    { 
        return $this->id; 
    } 
 
    public function getName(): string 
    { 
        return $this->name; 
    } 
 
    public function setName(string $name): void 
    { 
        $this->name = $name; 
    } 
 
    public function getType(): string 
    { 
        return $this->type; 
    } 
 
    public function setType(string $type): void 
    { 
        $this->type = $type; 
    } 
 
    public function getSize(): int 
    { 
        return $this->size; 
    } 
 
    public function setSize(int $size): void 
    { 
        $this->size = $size; 
    } 
 
    public function getCreatedAt(): \DateTimeInterface 
    { 
        return $this->createdAt; 
    } 
 
    /** 
     * @return string|null 
     */ 
    public function getFile(): ?string 
    { 
        return $this->file; 
    } 
 
    /** 
     * @param string|null $file 
     */ 
    public function setFile(?string $file): void 
    { 
        $this->file = $file; 
    } 
 
    /** 
     * @return string|null 
     */ 
    public function getPath(): ?string 
    { 
        return $this->path; 
    } 
 
    /** 
     * @param string|null $path 
     */ 
    public function setPath(?string $path): void 
    { 
        $this->path = $path; 
    } 
 
    public function getMessage(): ?Message 
    { 
        return $this->message; 
    } 
 
    public function setMessage(?Message $message): self 
    { 
        $this->message = $message; 
 
        return $this; 
    } 
}