# Dominio Attachable ## Propósito Centraliza el almacenamiento y la metadata de archivos adjuntos. Acepta archivos subidos o contenido Base64, los persiste en S3 y registra su tipo, MIME, extensión, tamaño, nombre original y clave única. ## Componentes principales - `Models/Attachment.php`: representa un adjunto y genera URL temporales de acceso. - `Services/AttachmentService.php`: almacena, copia y elimina archivos, compensando en S3 si falla la escritura en base de datos. - `Enums/AttachmentType.php`: clasifica imágenes, videos, PDF, audio, documentos y otros archivos. - `Exceptions/AttachmentStorageException.php`: expresa fallos propios del almacenamiento. ## Flujo principal 1. El consumidor entrega un `UploadedFile` o una cadena Base64 y un directorio. 2. El servicio valida el contenido, detecta MIME/extensión y genera una clave UUID. 3. El archivo se guarda en el disco `s3`. 4. Se crea el registro `Attachment`; ante error se elimina el objeto que había sido subido. ## API y dependencias No expone rutas HTTP propias. Lo consumen otros dominios, especialmente `Catalog` y `Tenant`. Depende de Laravel Storage, Symfony Mime y del modelo `Attachment`. ## Consideraciones - El directorio no puede quedar vacío después de normalizarlo. - La eliminación se considera fallida si S3 no confirma el borrado. - Las URL generadas son temporales; el vencimiento predeterminado es de 10 minutos.