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() }