feat: tipos UploadedFile, StorageConfig, S3Config en infra (issue 0014 fase 1)

This commit is contained in:
2026-04-18 17:10:31 +02:00
parent 3bc2d2573d
commit 82b792415b
6 changed files with 137 additions and 0 deletions
+37
View File
@@ -0,0 +1,37 @@
---
name: S3Config
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
type S3Config struct {
Endpoint string
Bucket string
AccessKey string
SecretKey string
Region string
UseSSL bool
}
description: "Configura la conexion a un almacenamiento S3-compatible (AWS S3, MinIO, Wasabi, etc)."
tags: [s3, storage, config, cloud, infra]
uses_types: []
file_path: "functions/infra/s3_config.go"
---
## Ejemplo
```go
cfg := S3Config{
Endpoint: "s3.amazonaws.com",
Bucket: "mi-bucket",
AccessKey: os.Getenv("S3_ACCESS_KEY"),
SecretKey: os.Getenv("S3_SECRET_KEY"),
Region: "us-east-1",
UseSSL: true,
}
```
## Notas
Tipo producto. Para AWS S3 usar `Endpoint = "s3.amazonaws.com"` y la region apropiada. Para MinIO local usar `Endpoint = "minio.local:9000"` y `UseSSL = false`. Las credenciales NUNCA se hardcodean — se inyectan desde env vars o un secret manager.
+31
View File
@@ -0,0 +1,31 @@
---
name: StorageConfig
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
type StorageConfig struct {
BaseDir string
MaxFileSize int64
AllowedTypes []string
}
description: "Configura el almacenamiento local de archivos: directorio base, tamano maximo y tipos MIME permitidos."
tags: [storage, config, upload, file, infra]
uses_types: []
file_path: "functions/infra/storage_config.go"
---
## Ejemplo
```go
cfg := StorageConfig{
BaseDir: "./uploads",
MaxFileSize: 10 << 20, // 10 MB
AllowedTypes: []string{"image/jpeg", "image/png", "application/pdf"},
}
```
## Notas
Tipo producto — todos los campos son obligatorios. `BaseDir` debe existir o ser creable por la app. `MaxFileSize` se aplica con `http.MaxBytesReader` durante el parse del multipart. `AllowedTypes` es una lista blanca verificada por magic bytes (no por el header Content-Type del request).
+37
View File
@@ -0,0 +1,37 @@
---
name: UploadedFile
lang: go
domain: infra
version: "1.0.0"
algebraic: product
definition: |
type UploadedFile struct {
Filename string `json:"filename"`
StoredName string `json:"stored_name"`
Size int64 `json:"size"`
ContentType string `json:"content_type"`
Path string `json:"path"`
CreatedAt time.Time `json:"created_at"`
}
description: "Metadata de un archivo subido y almacenado. Combina nombre original, nombre unico en disco, tamano, MIME type, ruta y timestamp de creacion."
tags: [upload, file, storage, http, infra]
uses_types: []
file_path: "functions/infra/uploaded_file.go"
---
## Ejemplo
```go
file := UploadedFile{
Filename: "vacaciones.png",
StoredName: "a1b2c3d4-e5f6-7890-abcd-ef1234567890.png",
Size: 102400,
ContentType: "image/png",
Path: "/var/uploads/a1b2c3d4-e5f6-7890-abcd-ef1234567890.png",
CreatedAt: time.Now(),
}
```
## Notas
Tipo producto — todos los campos siempre presentes. `Filename` se preserva por trazabilidad pero NO se usa como nombre real en disco (riesgo path traversal). `StoredName` es generado con UUID por `file_unique_name`. `Path` es la ruta completa en disco para storage local, o la key del objeto para S3.