Clone the project
git clone https://github.com/DigiventuresFintech/home-interview-challenge.git
Go to the project directory
cd home-interview-challenge
Install dependencies
npm install
Start the server
npm run dev
Deseamos crear páginas dinámicamente según un JSON de configuración consumido desde el servidor.
Se debe utilizar la librería de componentes React Strap: https://reactstrap.github.io/?path=/story/home-installation--page
El comportamiento de las páginas será:
Si el "path" se encuentra configurado, la página existe y debe generar su contenido.
Si el "path" no se encuentra configurado, se debe informar un error 404.
Los formularios generados deben modificar un estado que defina propiedades en un objeto que se utilizará para emitir al servidor en el body (se puede utilizar axios o fetch).
El código debe soportar cambios de configuración sin deber incidir en el código, siempre y cuando las instrucciones de ejecución como los algoritmos de validación existan.
La emisión del estado contenedor de los valores de los inputs deberá hacerse como método POST
a la ruta /:pathname
, la misma donde nos encontramos actualmente.
Ejemplo: si nos encontramos en /login
, el post
se debe hacer a /login
Como resultado se deberá tener una pantalla genérica donde según la URL se cargue y se genere el contenido según la configuración, donde agregando la propiedad "recovery" a la configuración, al ingresar a "/recovery" deberíamos ver contenido nuevo sin realizar modificaciones en el FrontEnd.
Se debe completar el código faltante del método get de ConfigurationController - server.js (línea 28)
para retornar la configuración.
Siempre es buena fuente de inspiración repasar un poco de teoría de patrones: (https://refactoring.guru/es/design-patterns/catalog)[link]
- Integrar MongoDB
- Crear modelo de configuración
- Implementar búsqueda de configuración en MongoDB (buscar por nombre de página)
Modelo real: https://github.com/DigiventuresFintech/home-interview-challenge/blob/main/models/inputs.json
Algunos inputs de ejemplo:
{
"path": {
//page path
"title": "", //título de la página
"inputs": [
{
"type": "text", //tipo de input o componente
"name": "username", //nombre del input en el evento
"label": "Username", //label del input
"regex": "^\w{1,32}$", //regex de control
"required": true //necesario o no para el envío
},
{
"type": "link", //<a href='' />
"target": "https://digiventures.la/", //página de destino
"text": "¿Any problem? Contact us" //texto que debe ser presionado
},
{
"type": "confirm_password",
"name": "password",
"label": "Confirm your password",
"regex": "^(?=.*d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$",
"conditions": {
//incluye condiciones complejas
"validations": [{ "comparision": "same", "input": "password" }]
//array de validaciones de comparación para dar como válido el input
//comparision: algoritmo de comparación
//input: indica un input del cual tomar el valor de comparasión
}
},
{
"type": "select",
"name": "country",
"label": "¿Where are you living?",
"options": [
//opciones del select
{ "value": "argentina", "label": "Argentina" },
{ "value": "other", "label": "Other" }
]
},
{
"type": "text",
"name": "custom_country",
"label": "Specify which country",
"conditions": {
"validations": [
{
"comparision": "not_includes",
"input": "country",
"values": ["argentina"]
}
//not_includes: algoritmo de - no inclusión
//values: array que contiene que valores no debe tener
//si escribe argentina debe dar error
],
"render": [
[
{
"comparision": "includes", //includes - debe contener el valor
"input": "country", //input de selección de valor
"values": ["other"] //array: debe contener el valor other
}
]
]
}
},
{
"type": "button",
"label": "Create account",
"method": "register" //debe invocar el método register
}
]
}
}
- @digiventures
- @agustinquetto (puedes contactarme si tienes preguntas)