# Models
Esta sección del servicio se compone de archivos dentro del directorio `/src/models`, cada uno asociado a la ruta que lleva su nombre. Si por ejemplo queremos definir el modelo de `User` que internamente tiene los métodos `getAll` y `update`, el archivo debería llamarse `user.ts`. Cada modelo debe estar asociado a una tabla de la base de datos.
### Importaciones
Primero, se debe importar el `pool` de la base de datos, el cual debería ya existir en la carpeta `src/util` con el nombre de archivo `database.ts`
```typescript
import pool from "../utils/database";
```
Finalmente hay importar las queries que se ejecutarán por cada método, estas deben en la carpeta `src/queries` y en este caso (ejemplo User), con el nombre de archivo `user.ts`
```typescript
import { _getAll, _getById, _upsert, _deleteById } from "../queries/user";
```
### Estructura de los métodos
Como los métodos interactúan directamente con la base de datos, deben ser nombrados por la acción que realizan, puntualmente:
- `getAll` trae todos los registros
- `getById` trae el registro que coincide con el `id`
- `updateById` modifica el registro que coincide con el `id`
- `upsert` crea un nuevo registro o lo modifica si existe
- `deleteById` elimina el registro que coincide con el `id`
Obviamente, pueden existir otros métodos que pueden realizar labores más específicas, pero la forma de nombrarlos debe ser semántica, por ejemplo `getByCustomerId` (trae todos los registros cuyo `customer_id` sea el que se indica como parámetro)
Deben especificarse el tipo de dato de salida y deben ser asíncronos, para el ejemplo:
```typescript
const getAll = async (): Promise<void>
```
### Exportación
Finalmente se deben exportar los métodos:
```typescript=
// src/models/post.ts
import pool from "../utils/database";
import { _getAll, _getById, _upsert, _deleteById } from "../queries/post";
import { Post } from "../interfaces/post";
const getAll = async (): Promise<Post[]> => {
const resultPosts = await pool.query(_getAll);
return resultPosts.rows;
};
const getById = async (id: string): Promise<Post | null> => {
const resultPost = await pool.query(_getById, [id]);
return resultPost.rowCount && resultPost.rowCount > 0
? (resultPost.rows[0] as unknown as Post)
: null;
};
const upsert = async (
user_id: number,
message: string,
image: string
): Promise<Post | null> => {
const resultPost = await pool.query(_upsert, [user_id, message, image]);
return resultPost.rowCount && resultPost.rowCount > 0
? (resultPost.rows[0] as unknown as Post)
: null;
};
const deleteById = async (id: string): Promise<Post | null> => {
const resultPost = await pool.query(_deleteById, [id]);
return resultPost.rowCount && resultPost.rowCount > 0
? (resultPost.rows[0] as unknown as Post)
: null;
};
export { getAll, getById, upsert, deleteById };
```
Ver los siguientes documentos:
- [**Creación de servicio BackEnd**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/B1eLiECDa)<br>
- [**Routes**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/B1zN9PAPp)<br>
- [**Controllers**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/SyFI9PAvT)<br>
- [**Queries**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/B1KJswCv6)<br>
- [**Schemas**](https://hackmd.io/@mGoZaVHZQTWgwFlq-J3U0w/Syhv28zk0)<br>