package services import ( "fmt" "strings" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) func slugifyProyecto(s string) string { s = strings.ToLower(s) replacer := strings.NewReplacer( " ", "-", "á", "a", "é", "e", "í", "i", "ó", "o", "ú", "u", "ñ", "n", "ü", "u", ) s = replacer.Replace(s) var b strings.Builder for _, r := range s { if (r >= 'a' && r <= 'z') || (r >= '0' && r <= '9') || r == '-' { b.WriteRune(r) } } return strings.Trim(b.String(), "-") } // CrearProyectoSimple crea un proyecto para un cliente a partir del flujo de // automatización con IA ("nombre, stack, cliente asociado"). El stack se antepone // a la descripción; la creación de repo/estructura inicial queda fuera de este // alcance (requiere integración con un proveedor Git, no cubierta aún). func CrearProyectoSimple(clienteID uint, nombre, stack, descripcion string) (*models.Proyecto, error) { if clienteID == 0 { return nil, fmt.Errorf("cliente_id requerido") } if strings.TrimSpace(nombre) == "" { return nil, fmt.Errorf("nombre requerido") } if stack != "" { descripcion = fmt.Sprintf("Stack: %s\n\n%s", stack, descripcion) } p := &models.Proyecto{ ClienteID: clienteID, Nombre: nombre, Slug: slugifyProyecto(nombre), Descripcion: descripcion, Color: "#8eb02f", Estado: "activo", } if err := models.CreateProyecto(p); err != nil { return nil, fmt.Errorf("no se pudo crear el proyecto: %w", err) } return p, nil }