
# **Prueba técnica para desarrolladores de backend**
Aqui encontrará la prueba técnica para el puesto de desarrollador backend de quick.com.co ! Probablemente llegaste aquí por que nos interasa su perfil y queremos poner a prueba tus habilidades tecnicas.
El propósito de este desafío es evaluar la capacidad de un desarrollador de backend para interpretar e implementar los requerimientos planteados. En este documento, se le presenta un escenario que está destinado a ayudar a mostrar sus talentos de desarrollo de software y despertar el pensamiento creativo y la resolución de problemas. Estaremos observando tanto el viaje como el producto final.
# **Entrega esperada**
1. Un API Rest usando algun framework (**Requerido**)
* FastApi(python) (**Preferiblemente**)
* Django(python) (**Opcional**)
* NodeJs(javascript) (**Opcional**)
3. Una copia del codigo en github. (**Requerido**)
5. Documentación del proyecto en markdown (**Opcional**)
6. Adjuntar al repositorio las indicaciones para correr y probar su proyecto. (**Requerido**)
7. Docker (**Opcional**)
8. JWT (**Opcional**)
9. Test unitarios (**Opcional**)
10. Despliegue de aplicación (**Opcional**)
11. Base de datos PostgreSQL, MySQL, SQLite, MongoDB (**PostgresSQL preferiblemente.**)
# **Se le calificará**
1. La elegancia, claridad, escalabilidad y organización de su código
1. Su comprensión de las mejores prácticas
1. Velocidad de desarrollo frente a entrega de calidad
1. Qué fácil sería para otro desarrollador entrar en el proyecto y trabajar contigo
1. Nuestra comprensión de la calidad de su proceso de desarrollo.
2. Uso adecuado de los códigos de respuesta HTTP
3. Uso adecuado de los métodos HTTP
4. Validación de campos
# **¿Donde debo entregar mi proyecto?**
Tan pronto reciba el correo donde se indican los requerimientos de la prueba tiene **72 horas** (3 días) para desarrollar la prueba y enviarla al los correos listados a continuacion.
* duvan.botello@quick.com.co
* desarrollador23@smartquick.com.co
Si tiene algúna duda, inconveniente o corrección de la prueba, puede comunicarse con nosotros.
Haga tantas preguntas al equipo como lo haría a lo largo de cualquier proyecto.
# **Requisitos**
Los Data Type y Length marcados con * deben ser definidos de acuerdo al criterio y experiencia del candidato.
Nuestro equipo tiene la tarea de generar una API para gestionar los usuarios y el acceso a la aplicacion. Se define para la capa de datos la siguiente estrucutra:
|Name|Data Type|Length/Precision|Not Null|
|--------|--------|--------|--------|
| id | int | * | Yes |
| first_name | varchar | * | Yes |
| last_name | varchar | * | Yes |
| date_birth | * | * | Yes |
| address | * | * | Yes |
| token | * | * | Not |
| password | * | 120 | yes |
| mobile_phone | varchar | * | yes |
| email | varchar | * | yes |
Teniendo en cuenta la tabla anterior usted debe desarrollar los siguentes endpoints:
***Algunos endpoints marcados con (security) deben estar protegidos por un token de acceso.***
## End-point: Login
Method: POST
>```
> /api/v1/users/login
>```
### Headers
|Content-Type|Value|
|---|---|
| Content-Type | application/json |
### Body (**raw**)
```json
{
"mobile_phone": "prueba",
"password": "prueba"
}
```
### Response 200 OK
```json
{
"user": {
"id": 53,
"first_name": "prueba",
"last_name": "prueba",
"session_active": true,
"date_birth": "1988-03-17",
"email": "prueba@yopmail.com",
"mobile_phone": "020202",
"password": "$2b$12$HGSW3f6EKIE8zf7JP.gGUeoagaYNnC.6NQAg6k8zHQO.rDBph8Wsq",
"address": "cl 50 b sur"
},
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtb2JpbGVfcGhvbmUiOiIwMjAyMDIiLCJlbWFpbCI6InBydWViYW9uYm9kYXJkaW5nNzAwQHlvcG1haWwuY29tIiwiZXhwIjoxNjMxODkxODM5fQ.26sWIpQk3HsMeLNWK1_sVbDyUbE8nNKUp5s3xjF0Uog",
"token_type": "bearer"
}
```
## End-point: GetUsers
Method: GET
>```
> /api/v1/users
>```
### Headers
|Content-Type|Value|
|---|---|
| Content-Type | application/json |
### Response 200 OK
```json
[
{
"id": 1,
"first_name": "test",
"last_name": "test",
"date_birth": "1996-05-10",
"mobile_phone": "213212656",
"email": "test@gmail.com",
"address": null,
"city_id": null,
"session_active": true
},{
"id": 1,
"first_name": "test",
"last_name": "test",
"date_birth": "1996-05-10",
"mobile_phone": "213212656",
"email": "test@gmail.com",
"address": null,
"city_id": null,
"session_active": true
},{
"id": 1,
"first_name": "test",
"last_name": "test",
"date_birth": "1996-05-10",
"mobile_phone": "213212656",
"email": "test@gmail.com",
"address": null,
"city_id": null,
"session_active": true
}
]
```
## End-point: GetUser
Method: GET
>```
> (security) /api/v1/users/{id_user}
>```
### Headers
|Content-Type|Value|
|---|---|
| Content-Type | application/json |
### Response 200 OK
```json
{
"id": 2,
"document_type_id": null,
"document_number": null,
"first_name": null,
"last_name": null,
"date_birth": null,
"mobile_phone": "5654654",
"email": "test",
"address": null,
"city_id": null,
"session_active": true
}
```
## End-point: CreateUser
Method: POST
>```
> (security) /api/v1/users
>```
### Headers
|Content-Type|Value|
|---|---|
| Content-Type | application/json |
### Body (**raw**)
```json
{
"first_name": "string",
"last_name": "string",
"date_birth": "2021-09-17",
"mobile_phone": "string",
"email": "user@example.com",
"password": "string",
"address": "stringst"
}
```
### Response 200 OK
```json
{
"first_name": "string",
"last_name": "string",
"date_birth": "2021-09-17",
"mobile_phone": "string",
"email": "user@example.com",
"password": "string",
"address": "stringst"
}
```
## End-point: GetUser
Method: GET
>```
> (security) /api/v1/users/{id_user}
>```
### Headers
|Content-Type|Value|
|---|---|
| Content-Type | application/json |
### Response 200 OK
```json
{
"id": 2,
"document_type_id": null,
"document_number": null,
"first_name": null,
"last_name": null,
"date_birth": null,
"mobile_phone": "5654654",
"email": "test",
"address": null,
"city_id": null,
"session_active": true
}
```
## End-point: UpdateUser
Method: PUT
>```
> (security) /api/v1/users/{id_user}
>```
### Headers
|Content-Type|Value|
|---|---|
| Content-Type | application/json |
### Body (**raw**)
```json
{
"first_name": "string",
"last_name": "string",
"date_birth": "2021-09-17",
"mobile_phone": "string",
"email": "user@example.com",
"password": "string",
"address": "stringst"
}
```
### Response 200 OK
```json
{
"first_name": "string",
"last_name": "string",
"date_birth": "2021-09-17",
"mobile_phone": "string",
"email": "user@example.com",
"password": "string",
"address": "stringst"
}
```
## End-point: DeleteUser
Method: DELETE
>```
> (security) /api/v1/users/{id_user}
>```
### Headers
|Content-Type|Value|
|---|---|
| Content-Type | application/json |
### Response 200 OK
```json
{
"first_name": "string",
"last_name": "string",
"date_birth": "2021-09-17",
"mobile_phone": "string",
"email": "user@example.com",
"password": "string",
"address": "stringst"
}
```
# **✨¡Gracias! ¡Buena suerte!**