feat: file_validate_type y file_unique_name puras (issue 0014 fase 2)
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package infra
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"unicode"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// FileUniqueName genera un nombre de archivo unico combinando un UUID v4 con la
|
||||
// extension sanitizada del nombre original.
|
||||
//
|
||||
// Ejemplo: "vacaciones.PNG" -> "a1b2c3d4-e5f6-7890-abcd-ef1234567890.png"
|
||||
//
|
||||
// La extension se sanitiza: solo se conservan caracteres alfanumericos en minusculas
|
||||
// y se trunca a 16 caracteres como maximo. Si el archivo no tiene extension, se
|
||||
// retorna solo el UUID.
|
||||
//
|
||||
// La funcion es "pura en intencion" en el sentido de que su firma no depende del
|
||||
// contexto, pero internamente usa un generador de UUIDs aleatorios — el resultado
|
||||
// no es determinista.
|
||||
func FileUniqueName(originalName string) string {
|
||||
id := uuid.NewString()
|
||||
|
||||
ext := filepath.Ext(originalName)
|
||||
ext = strings.TrimPrefix(ext, ".")
|
||||
ext = sanitizeExt(ext)
|
||||
if ext == "" {
|
||||
return id
|
||||
}
|
||||
return id + "." + ext
|
||||
}
|
||||
|
||||
// sanitizeExt deja solo caracteres alfanumericos en minusculas y trunca a 16 chars.
|
||||
func sanitizeExt(ext string) string {
|
||||
var b strings.Builder
|
||||
for _, r := range strings.ToLower(ext) {
|
||||
if unicode.IsLetter(r) || unicode.IsDigit(r) {
|
||||
b.WriteRune(r)
|
||||
}
|
||||
if b.Len() >= 16 {
|
||||
break
|
||||
}
|
||||
}
|
||||
return b.String()
|
||||
}
|
||||
Reference in New Issue
Block a user