# Generar

Vela proporciona un generador para crear modelos de base de datos, formularios, recursos, esquemas y scaffolds CRUD completos. Todos comparten una sintaxis común. Dentro de esa sintaxis, las formas singular y plural tienen significado.

### Sintaxis

```
$ vela generate <type> <name> [fields...]
```

### Tipos

- [`form`](/es/generate/form) - Un formulario y un esquema Zod, sin modelo de base de datos
- [`schema`](/es/generate/schema) - Un esquema Zod por sí solo
- [`resource`](/es/generate/resource) - Un modelo de base de datos y su esquema, sin frontend
- [`scaffold`](/es/generate/scaffold) - Una interfaz CRUD completa, modelo, esquema y migración
- [`migration`](/es/generate/migration) - Una migración que altera una colección existente
- [`workflow`](/es/generate/workflow) - Un workflow en segundo plano, sin modelo de base de datos

`form` y `schema` funcionan en cualquier proyecto SvelteKit, con o sin backend. El resto necesita un [backend](/es/enable/backend), y `scaffold --remote` también necesita [shadcn-svelte](/es/ui).

### Nombre

El nombre en plural del modelo, formulario, recurso, esquema o scaffold, por ejemplo `pets` o `todos`. Los nombres de modelo siempre son plurales y se convertirán al plural si se proporciona la forma singular. Los nombres pueden anidarse en directorios usando una barra (`/`) como separador. Por ejemplo, `users/pets` creará un recurso en `/users/pets`.

### Campos

Los campos se definen como pares `name:type`, por ejemplo `name:string` o `age:number`. Si el modelo ya existe en la base de datos, la opción `fields` puede omitirse y el generador usará los campos existentes.

### Tipos de campo

Vela admite los siguientes tipos de campo:

```
text
number
bool
date
email
password
url
editor
autodate
select
file/files
json
geoPoint
relation
```

#### Alias

Se aceptan nombres familiares de otros ecosistemas y se normalizan a los tipos anteriores:

```
string                               → text
boolean                              → bool
integer, int, float, decimal, double → number
datetime, timestamp                  → date
geopoint                             → geoPoint
references                           → relation
```

### autodate

El tipo de campo `autodate` es un tipo especial que asigna automáticamente al campo la fecha y hora actuales al crear o actualizar. Los nombres de campo para autodate pueden ser: `created/created_at` o `updated/updated_at`.

### select

El campo select tiene una sintaxis especial para definir las opciones. Las opciones se definen como pares `value:label`. La forma singular o plural del nombre del campo determina si el select es de selección simple o múltiple.

```
$ vela generate scaffold pets type:select(dog:Dog,cat:Cat,bird:Bird)
```

```
$ vela generate scaffold products colors:select(red:Red,green:Green,blue:Blue)
```

### file

El campo file se usa para subir archivos al servidor. La forma singular o plural del nombre del campo determina si el campo acepta un solo archivo o un array de archivos.

```
$ vela generate scaffold owners avatar:file
```

```
$ vela generate scaffold pets photos:files
```

### Campos obligatorios

Los campos se marcan como obligatorios añadiendo `!` al nombre del campo. Esto marca el campo como obligatorio en la base de datos y en el esquema Zod para la validación del formulario.

```
$ vela generate scaffold pets name:string! age:number!
```

### Relaciones

Además de los tipos de campo anteriores, Vela admite pasar el nombre de cualquier modelo existente para crear una relación. Singular frente a plural tiene significado aquí, ya que determina si la relación es uno-a-muchos o muchos-a-muchos.

```
$ vela generate scaffold pets name:string owner:user
```

```
$ vela generate scaffold teams name:string members:users
```

De forma similar a Ruby on Rails, se puede usar el atajo `references` para crear relaciones a partir del nombre del campo.

```
$ vela generate scaffold posts title:string author:user tags:references
```

### Cambiar un modelo existente

Una vez que una colección existe, los campos se añaden, eliminan y renombran con [`vela generate migration`](/es/generate/migration):

```
$ vela generate migration pets add birthday:date
```

### Propiedad y permisos

> [Depende de: auth](/es/enable/auth)

Si la autenticación está habilitada con el comando `vela enable auth`, es posible asociar modelos con el usuario autenticado. Esto puede hacerse directamente en el modelo con el tipo de campo especial `current_user`, que asignará automáticamente al campo el usuario autenticado en la creación (y excluirá el campo del formulario del frontend).

```
$ vela generate scaffold posts title:string author:current_user
```

Si el modelo está anidado dentro de otro modelo, vela recorre la jerarquía de modelos para encontrar el modelo padre más cercano con una relación con el usuario autenticado.

```
$ vela generate resource teams name:string
$ vela generate resource users email:string team:references
$ vela generate scaffold projects title:text team:references
```

En este ejemplo, el modelo `users` está asociado con el modelo `teams`. El acceso al modelo `projects` está restringido a los usuarios que son miembros del equipo del proyecto.

#### Uso

En el proyecto de SvelteKit generado hay dos formas de recuperar datos de la base de datos. La primera es la API de administración `locals.admin`, equivalente a consultar la base de datos directamente. La segunda es la API con ámbito de usuario `locals.pb`, que da acceso a la base de datos limitado al usuario autenticado.

#### API de administración

```ts
export const load = async ({ locals }) => {
    const posts = await locals.admin.collection('posts').getFullList();
    return { posts };
}
```

#### API con ámbito de usuario

```ts
export const load = async ({ locals }) => {
    const posts = await locals.pb.collection('posts').getFullList();
    return { posts };
}
```

#### Limitaciones

La propiedad mediante referencia inversa no está soportada.