feat: tipos UploadedFile, StorageConfig, S3Config en infra (issue 0014 fase 1)
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
package infra
|
||||
|
||||
// S3Config configura la conexion a almacenamiento S3-compatible (AWS S3, MinIO, etc).
|
||||
type S3Config struct {
|
||||
Endpoint string `json:"endpoint"` // URL del servidor (ej: "s3.amazonaws.com", "minio.local:9000")
|
||||
Bucket string `json:"bucket"` // nombre del bucket
|
||||
AccessKey string `json:"access_key"` // access key id
|
||||
SecretKey string `json:"secret_key"` // secret access key
|
||||
Region string `json:"region"` // region (ej: "us-east-1")
|
||||
UseSSL bool `json:"use_ssl"` // si true, usa https
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package infra
|
||||
|
||||
// StorageConfig configura el almacenamiento local de archivos subidos.
|
||||
type StorageConfig struct {
|
||||
BaseDir string `json:"base_dir"` // directorio base para almacenar archivos
|
||||
MaxFileSize int64 `json:"max_file_size"` // tamano maximo en bytes (ej: 10<<20 = 10MB)
|
||||
AllowedTypes []string `json:"allowed_types"` // MIME types permitidos (ej: ["image/png", "image/jpeg", "application/pdf"])
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package infra
|
||||
|
||||
import "time"
|
||||
|
||||
// UploadedFile contiene la metadata de un archivo subido y almacenado en disco o S3.
|
||||
type UploadedFile struct {
|
||||
Filename string `json:"filename"` // nombre original del archivo
|
||||
StoredName string `json:"stored_name"` // nombre en disco (UUID-based)
|
||||
Size int64 `json:"size"` // tamano en bytes
|
||||
ContentType string `json:"content_type"` // MIME type detectado
|
||||
Path string `json:"path"` // ruta completa en disco (o key S3)
|
||||
CreatedAt time.Time `json:"created_at"` // timestamp de creacion
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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).
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user