---
# System prepended metadata

title: Models

---

# 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>