Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PR challenge terminado #317

Closed
wants to merge 27 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ef9799e
Se inicializa repositorio
fedekrenn Jul 18, 2023
815149d
Se renderizan los primeros libros
fedekrenn Jul 23, 2023
13181f6
Se crea funcionalidad de lista de lectura
fedekrenn Jul 23, 2023
749665d
Filtro por géneros
fedekrenn Jul 24, 2023
69698d7
Se añade persistencia en localStorage
fedekrenn Jul 24, 2023
e5cdde4
Se corrige bug del filtrado
fedekrenn Jul 25, 2023
22e64ef
Se termina función de filtros
fedekrenn Jul 25, 2023
4772f48
Se añade lógica para sincronización entre pestañas
fedekrenn Jul 26, 2023
a98eba8
Se terminan test y readme
fedekrenn Jul 27, 2023
29713f6
Últimos estilos y actualización del readme
fedekrenn Jul 27, 2023
3a5576b
Update README.md
fedekrenn Jul 27, 2023
a61e799
Se añade spinner
fedekrenn Jul 27, 2023
ca83b0a
Merge branch 'main' of https://github.com/fedekrenn/pruebas-tecnicas
fedekrenn Jul 27, 2023
a33420c
Estilos hover
fedekrenn Jul 27, 2023
89817ec
Refactorización de funcion de filtrado
fedekrenn Aug 2, 2023
cd128a5
Se separan responsabilidades
fedekrenn Oct 13, 2023
0017e45
New challenge added
fedekrenn Nov 24, 2023
632dc97
Refactor code
fedekrenn Nov 27, 2023
f9fb303
Add new files and implement functions for node callbacks and promises
fedekrenn Dec 12, 2023
7c146d4
Add solutions for news exercices
fedekrenn Dec 13, 2023
9341eb6
Refactor dotenv module and update tests
fedekrenn Dec 14, 2023
192bb28
Add server challenge
fedekrenn Dec 14, 2023
13a0f56
Add solution for new challenge
fedekrenn Dec 18, 2023
aed19e7
Refactor code and add tests for App component
fedekrenn Dec 18, 2023
8a2d3c1
Add book and author routes and controllers
fedekrenn Dec 26, 2023
f94f28a
Fix book creation and getPagesAverage error handling
fedekrenn Dec 29, 2023
06569fa
Add validation for author and book data
fedekrenn Jan 2, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 148 additions & 0 deletions live-coding/01-node-callbacks-promises/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@

# Prueba Técnica JavaScript + Node.js

Escribe las soluciones en el archivo `solutions/index.js` manteniendo el nombre de las funciones y sus `export`. Usa `ESModules` en tu proyecto de Node.js

1 - Arregla esta función para que el código posterior funcione como se espera:

```javascript
import net from 'node:net'

export const ping = (ip) => {
const startTime = process.hrtime()

const client = net.connect({ port: 80, host: ip }, () => {
client.end()
return { time: process.hrtime(startTime), ip }
})

client.on('error', (err) => {
throw err
client.end()
})
}

ping('midu.dev', (err, info) => {
if (err) console.error(err)
console.log(info)
})
```

2 - Transforma la siguiente función para que funcione con promesas en lugar de callbacks:

```javascript
export function obtenerDatosPromise(callback) {
setTimeout(() => {
callback(null, { data: 'datos importantes' });
}, 2000);
}
```

3 - Explica qué hace la funcion. Identifica y corrige los errores en el siguiente código. Si ves algo innecesario, elimínalo. Luego mejoralo para que siga funcionando con callback y luego haz lo que consideres para mejorar su legibilidad.

```javascript
export function procesarArchivo() {
fs.readFile('input.txt', 'utf8', (error, contenido) => {
if (error) {
console.error('Error leyendo archivo:', error.message);
return false;
}

setTimeout(() => {
const textoProcesado = contenido.toUpperCase();

fs.writeFile('output.txt', textoProcesado, error => {
if (error) {
console.error('Error guardando archivo:', error.message);
return false;
}

console.log('Archivo procesado y guardado con éxito');
return true
});

}, 1000);
});
}
```

4 - ¿Cómo mejorarías el siguiente código y por qué? Arregla los tests si es necesario:

```javascript
import fs from 'node:fs';

export function leerArchivos() {
const archivo1 = fs.readSync('archivo1.txt', 'utf8');
const archivo2 = fs.readSync('archivo2.txt', 'utf8');
const archivo3 = fs.readSync('archivo3.txt', 'utf8');

return `${archivo1} ${archivo2} ${archivo3}`
}

leerArchivos();
```

5 - Escribe una funcion `delay` que retorne una promesa que se resuelva después de `n` milisegundos. Por ejemplo:

```javascript
export async function delay () {
// ...
}

delay(3000).then(() => console.log('Hola mundo'));
// o..
await delay(3000)
console.log('Hola mundo')
```

6. Vamos a crear nuestra propia utilidad `dotenv` en el archivo `dotenv.js`.

- La utilidad debe devolver un método `config` que lee el archivo `.env` y añade las variables de entorno que haya en el archivo al objeto `process.env`.

- Por ejemplo si tu archivo `.env` contiene:

```sh
PORT=8080
TOKEN="123abc"
```

Entonces podríamos hacer esto:

```javascript
const dotenv = require("./dotenv.js");
dotenv.config()

console.log(process.env.PORT) // "8008"
console.log(process.env.TOKEN) // "123abc"
```

También se le puede pasar el path del archivo `.env` como parámetro:

```javascript
const dotenv = require("./dotenv.js");
dotenv.config("./config/.env.local")
```

Cosas a tener en cuenta:

- Sólo se permite usar el módulo `fs` para leer el archivo.
- Si el archivo no existe, no debe dar error, simplemente no hace nada.
- Si el archivo existe, pero no tiene ninguna variable de entorno, no debe hacer nada.
- Sólo debe soportar el archivo `.env` o el que se le pasa como parametro, no hace falta que soporte `.env.local`, `.env.development` y similares de forma automática.
- Las variables de entorno siempre son strings, por lo que si en el archivo `.env` hay un número, por ejemplo `PORT=8080`, al leerlo con `fs` y añadirlo a `process.env` debe ser un string, no un número.
- `process.env` es un objeto y, por lo tanto, es mutable. Esto significa que podemos añadir propiedades nuevas sin problemas.


7 - Diseña una API REST utilizando Express que permite a los usuarios crear, leer, modificar, actualizar y eliminar elementos de una lista.

La lista tendrá objetos que tienen la siguiente forma:

```javascript
{
id: 1,
content: 'Item 1'
}
```

Haz la solución en el archivo `solutions/server.js` y exporta el `app` y `server` creado.
Instala Express con `npm install express`. No te preocupes por CORS.
29 changes: 29 additions & 0 deletions live-coding/01-node-callbacks-promises/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "01-node-callbacks-promises",
"version": "1.0.0",
"type": "module",
"description": "Ejercicios de live coding sobre callbacks y promises",
"main": "index.js",
"directories": {
"test": "tests"
},
"scripts": {
"test": "echo \"Please use pnpm test1 or pnpm test2\"",
"test1": "node tests/index.test.js",
"test2": "node tests/dotenv.test.js",
"test3": "node tests/server.test.js"
},
"keywords": [],
"author": "Federico Krenn",
"license": "ISC",
"devDependencies": {
"standard": "17.1.0",
"supertest": "6.3.3"
},
"eslintConfig": {
"extends": "standard"
},
"dependencies": {
"express": "4.18.2"
}
}
Loading