You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+86-34
Original file line number
Diff line number
Diff line change
@@ -3,23 +3,27 @@
3
3
- Asegurate de tener el archivo .dev.vars (Pídele al equipo los valores correspondientes.)
4
4
- Puedes correr una BDD local si te parece.
5
5
- Para correr el proyecto con las BDD de desarrollo, tienes que agregar un archivo `.dev.vars` con los valores de las mismas.
6
-
- Preguntale al equipo por los valores de la BDD, (o crea tu propia BDD en [turso.tech](https://turso.tech/))
7
-
- Pide las llaves de autenticacion para clerk
8
-
- Agregala a .dev.vars bajo `CLERK_PEM_PUBLIC_KEY` y `CLERK_ISSUER_ID`
6
+
- Crear una base de datos en turso.tech
7
+
- Instala el CLI de turso [acá](https://github.com/tursodatabase/turso-cli)
8
+
- Authentícate con `turso auth login`
9
+
- Crea una base de datos con `turso db create NOMBRE_DE_TU_BDD`
10
+
- Obten la TOKEN de tu DB con `turso db tokens create NOMBRE_DE_TU_BDD`
11
+
- Obten la URL de tu DB con `turso db tokens list`
12
+
- Guarda la URL de tu BDD y la token en el archivo .dev.vars bajo `DATABASE_URL` y `DATABASE_TOKEN`
9
13
- Finalmente, `npm i` & `num run dev`
10
-
11
-
# Cómo contribuir al proyecto
12
-
13
-
- Si buscas una feature nueva, sugiérela creando un issue [acá](https://github.com/JSConfCL/gql_api/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc).
14
-
- Haz un fork del repositorio y crea una nueva rama para tu funcionalidad o corrección.
15
-
- Realiza tus cambios, y escribe pruebas que cubran el nuevo código.
16
-
- Envía una solicitud de pull.
14
+
- Listo! Tu servidor GraphQL está corriendo en http://127.0.0.1:8787
17
15
18
16
# Cómo escribir tests
19
17
18
+
> PSA: Los tests se corren con `npm run tests` (o `npm run test:interactive` si quieres explorar una UI con mas informacion)
19
+
20
20
## Preparación del entorno de prueba
21
21
22
-
Antes de empezar a escribir tus tests, asegúrate de tener un entorno de prueba adecuado. Puedes necesitar borrar y recrear la base de datos antes de cada test para asegurarte de que los datos de un test no afecten a los demás. En nuestros ejemplos, usamos la función clearDatabase() en el hook afterEach() para lograr esto.
22
+
> La expectativa de nuestros tests, es que cada archivo de tests pueda correr en paralelo (y aislados) el uno del otro.
23
+
> Por lo mismo, creamos una base de datos nueva antes de correr cada test.
24
+
> Para asegurarte de que esto tambien ocurra entre tests del mismo archivo, recuerda poner en tu archivo de tests,
25
+
> un hook `afterEach` que limpie la base de datos.
26
+
> (En nuestros ejemplos, usamos la función clearDatabase() en el hook afterEach() para lograr esto.)
23
27
24
28
## Escribir la query o mutación
25
29
@@ -40,8 +44,13 @@ query getUsers {
40
44
## Generar código
41
45
42
46
Para poder correr los test, necesitamos tener funciones y variables en JavaScript/Typescript, no en "graphql".
47
+
Podríamos escribir la query o mutación, como un string, directamente en un archivo `.ts`. Pero eso es tedioso, propenso a errores, y no nos da autocompletado.
48
+
49
+
Para evitar esto, usamos un generador de código, que nos permite escribir la query o mutación en un archivo `.gql`, y luego generar el código asociado a esta operación de graphql.
50
+
43
51
Usaremos el archivo `.gql` que creamos recien, y correremos el comando `npm run generate`.
44
-
Esto generará codigo y tipos asociados a esta operación de graphql, por ejemplo:
52
+
53
+
Esto generará codigo y tipos asociados a esta operación de graphql, por ejemplo, la query que definimos arriba, generará el siguiente archivo:
> De igual manera, tenemos el helper `executeGraphqlOperationAsAdmin` para ejecutar queries o mutaciones como un admin.
171
+
> Es un helper similar a `executeGraphqlOperationAsUser`, con la salvedad que no requiere que le pases un usuario como segundo parámetro, y lo crea por ti.
172
+
138
173
## Verifica tus respuestas:
139
174
140
175
Puedes usar métodos assert o expect de [Vitest](https://vitest.dev/api/expect.html)
Además de verificar que tu resolver devuelve los datos correctos, verifica cómo maneja los errores. Por ejemplo, puedes escribir un test que pase datos incorrectos a tu mutación y luego verificar que la respuesta contiene el error correcto, o que falla donde debería fallar 😀.
206
+
Además de verificar que tu resolver devuelve los datos correctos, verifica cómo maneja los errores.
207
+
Por ejemplo, puedes escribir un test que pase datos incorrectos a tu mutación y luego verificar que la respuesta contiene el error correcto, o que falla donde debería fallar 😀.
172
208
173
209
# Migraciones
174
210
@@ -177,11 +213,16 @@ Usamos `drizzle` y `drizzle-kit` para manejar conexiones a la BDD, que genera au
177
213
178
214
## Cómo escribir migraciones?
179
215
180
-
### 1. Actualiza el esquema.
216
+
### 1. Actualiza el esquema de la base de datos.
217
+
218
+
> AKA. Crea o edita Tablas, Columnas, Indices, etc.
219
+
220
+
Primero, necesitas actualizar el archivo del esquema en `./src/datasources/db/schema/tables.ts`. (o )
221
+
Este archivo define la estructura de las tablas en la BDD.
222
+
223
+
> Las relaciones entre tablas, se definen en `./src/datasources/db/schema/relations.ts`.
224
+
> Los esquemas de query/update se definen en `./src/datasources/db/schema/CRUD.ts`.
181
225
182
-
Primero, necesitas actualizar el archivo del esquema en `./src/datasources/db/schema.ts`.
183
-
Este archivo define la estructura de la base de datos.
184
-
Por ejemplo, aquí es donde se definen las tablas y sus campos, así como las relaciones entre las tablas.
185
226
Para definir una tabla, utilizas la función `sqliteTable()`, donde el primer argumento es el nombre de la tabla y el segundo es un objeto que define los campos de la tabla.
En este ejemplo, se define una tabla users con varios campos, incluyendo id, name, y bio. Los campos se definen utilizando funciones como text() e integer(), y se pueden agregar opciones adicionales, como unique(), notNull(), y default().
239
+
Esto define una tabla users con varios campos, incluyendo id, name, y bio.
240
+
Los campos se definen utilizando funciones como text() e integer(), y se pueden agregar opciones adicionales, como unique(), notNull(), y default().
199
241
200
242
### 2. Genera los archivos de migración.
201
243
202
-
Una vez que hayas actualizado el esquema, debes generar los archivos de migración. Para hacerlo, ejecuta npx db:generate.
244
+
Una vez que hayas actualizado el esquema, debes generar los archivos de migración. Para hacerlo, ejecuta `npx db:generate`.
203
245
204
246
### 3. Verifica las migraciones:
205
247
@@ -211,24 +253,34 @@ Puedes hacer esto corriendo todos los tests. Estos geeneran una BDD desde 0, y c
211
253
Finalmente, ejecuta las migraciones con `npm run db:migrate`.
212
254
Estos comandos utilizan las variables de entorno definidas en el archivo .dev.vars para conectarse a las BDD de desarrollo.
213
255
256
+
### 5. Como limpiar tu base de datos:
257
+
258
+
- conectate a tu bdd con `turso db shell NOMBRE_DE_TU_BDD`
259
+
- ejecuta `select 'drop table ' || name || ';' from sqlite_master where type = 'table';` para obtener todas las tablas de tu bdd
260
+
- Esto te devolverá un resultado como el siguiente:
261
+
```txt
262
+
drop table users;
263
+
drop table events;
264
+
drop table event_attendees;
265
+
drop table event_invitations;
266
+
drop table event_invitation_tokens;
267
+
```
268
+
- copia y pega el resultado en tu terminal para eliminar todas las tablas de tu bdd.
269
+
- sal de la shell con `.quit`
270
+
- Listo! Tu bdd está 100% limpia. 😊
271
+
214
272
# Requisitos
215
273
216
274
- Tener un archivo `.dev.vars` con el siguiente contenido
217
-
218
-
```txt
219
-
DATABASE_URL="PREGUNTALE AL EQUIPO POR ESTO"
220
-
DATABASE_TOKEN="PREGUNTALE AL EQUIPO POR ESTO"
221
-
CLERK_PEM_PUBLIC_KEY="PREGUNTALE AL EQUIPO POR ESTO"
222
-
CLERK_ISSUER_ID="PREGUNTALE AL EQUIPO POR ESTO"
223
-
```
275
+
```txt
276
+
DATABASE_URL="PREGUNTALE AL EQUIPO POR ESTO"
277
+
DATABASE_TOKEN="PREGUNTALE AL EQUIPO POR ESTO"
278
+
CLERK_PEM_PUBLIC_KEY="PREGUNTALE AL EQUIPO POR ESTO"
279
+
CLERK_ISSUER_ID="PREGUNTALE AL EQUIPO POR ESTO"
280
+
```
224
281
225
282
> BRO-TIP 🔥
226
-
227
-
Agrega una variable `ENFORCED_JWT_TOKEN` a tu archivo `.dev.vars`, para utilizarla por defecto en graphiql.
228
-
229
-
## Como correr tests
230
-
231
-
-`npm run test`
283
+
> Agrega una variable `ENFORCED_JWT_TOKEN` a tu archivo `.dev.vars`, para utilizarla por defecto en graphiql.
A date string, such as 2007-12-03, compliant with the `full-date` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.
18
+
"""
19
+
scalarDate
20
+
21
+
"""
22
+
A date-time string at UTC, such as 2007-12-03T10:15:30Z, compliant with the `date-time` format outlined in section 5.6 of the RFC 3339 profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.
23
+
"""
24
+
scalarDateTime
25
+
26
+
"""
27
+
Representation of an Event (Events and Users, is what tickets are linked to)
28
+
"""
29
+
typeEvent {
30
+
address: String
31
+
community: Community
32
+
description: String
33
+
endDateTime: DateTime
34
+
id: String!
35
+
latitude: String
36
+
longitude: String
37
+
maxAttendees: Int
38
+
meetingURL: String
39
+
name: String!
40
+
startDateTime: DateTime!
41
+
status: EventStatus!
42
+
tags: [Tag!]!
43
+
users: [User!]!
44
+
visibility: EventVisibility!
45
+
}
46
+
47
+
inputEventCreateInput {
48
+
address: String
49
+
communityId: String!
50
+
description: String!
51
+
endDateTime: DateTime
52
+
latitude: String
53
+
longitude: String
54
+
maxAttendees: Int!
55
+
meetingURL: String
56
+
name: String!
57
+
startDateTime: DateTime!
58
+
status: EventStatus
59
+
timeZone: String
60
+
visibility: EventVisibility
61
+
}
62
+
63
+
enumEventStatus {
64
+
active
65
+
inactive
66
+
}
67
+
68
+
enumEventVisibility {
69
+
private
70
+
public
71
+
unlisted
72
+
}
73
+
74
+
inputEventsSearchInput {
75
+
id: String
76
+
name: String
77
+
startDateTimeFrom: DateTime
78
+
startDateTimeTo: DateTime
79
+
status: EventStatus
80
+
visibility: EventVisibility
81
+
}
82
+
83
+
typeMutation {
84
+
"""Create an event"""
85
+
createEvent(input: EventCreateInput!): Event!
86
+
}
87
+
88
+
typeQuery {
89
+
"""Get a list of communities. Filter by name, id, or status"""
0 commit comments