API Rest desarrollada en Java con Spring Boot para la gestión de usuarios(login y registro), roles, desafíos, evaluaciones, categorias y proyectos.
- Funcionalidades
- Requerimientos previos
- Configuración
- Swagger
- Tecnologías utilizadas
- Estructura del proyecto
- Modelo entidad-relación
- Licencia
🔐 Autenticación
| Método | Endpoint | Reglas de negocio |
|---|---|---|
| POST | /login |
Inicia sesión y obtiene un Token JWT. |
👤 Usuarios
| Método | Endpoint | Reglas de negocio |
|---|---|---|
| POST | /users/register |
- Verificar si todos los campos obligatorios se están ingresando correctamente. - La API no debe permitir el registro de usuarios duplicados (con el mismo correo) y debe tener al menos un número y una letra mayúscula. - Asignar el rol USER por defecto. - La API debe retornar la información del nuevo usuario y el token. - Si elige el rol MENTOR, la propiedad mentor es necesaria y de forma similar para el rol MENTEE con la propiedad mentee. - Si el correo ya existe retornar un código HTTP 409. - Si la contraseña tiene menos de 8 o más de 15 caracteres retornar un 400. - Si la contraseña no tiene al menos un letra mayúscula y un número retornar un 400. |
| GET | /users |
- Retornar los primeros 10 resultados ordenados por id. - Devolver todos los atributos menos la contraseña. - Obtener la respuesta con paginación para controlar el volumen de los datos. - Solo el rol ADMIN puede obtener todos los usuarios. |
| GET | /users/{id} |
- Retornar el usuario que coincida con el id y que además se encuentre habilitado. - Si no encuentra el usuario retornar un 404. - Solo el rol ADMIN puede buscar usuarios. |
| UPDATE | /users/{id} |
- Si no se completan los campos obligatorios retorna un 400. - Si no encuentra el usuario retornar un 404. - Solo el rol ADMIN puede actualizar usuarios. - Si elige el rol MENTOR, la propiedad mentor es necesaria y de forma similar para el rol MENTEE con la propiedad mentee. - Si el correo ya existe retornar un código HTTP 409. - Si la contraseña tiene menos de 8 o más de 15 caracteres retornar un 400. - Si la contraseña no tiene al menos un letra mayúscula y un número retornar un 400. |
| DELETE | /users/{id} |
- Si la eliminación es exitosa retornar un 204. - Si no encuentra el usuario retornar un 404. - Solo el rol ADMIN puede eliminar usuarios. |
🗂️ Categorías de Proyectos
| Método | Endpoint | Reglas de negocio |
|---|---|---|
| POST | /categories |
- Retornar la información de la categoría creada. - En el header retorna el path para obtener la categoría. - Si el nombre no se completa mostrar un error 400. - Si la creación fue exitosa retornar un 201. |
| GET | /categories |
- Lectura paginada de los registros. - Por defecto el tamaño de la página es de 10. - Por defecto el ordenamiento es por id. |
| GET | /categories/{id} |
- Si la categoría no existe retornar un 404. |
| UPDATE | /categories/{id} |
- Si la categoría no existe retornar un 404. - Si el nombre no se completa mostrar un error 400. |
| DELETE | /categories/{id} |
- Si la categoría no existe retornar un un código HTTP 404. - Si la eliminación fue exitosa retornar un código HTTP 204 No Content. - Realizar una eliminación lógica. |
🎯 Desafíos
| Método | Endpoint | Reglas de negocio |
|---|---|---|
| POST | /challenges |
- Si algún campo obligatorio no se completa retornar un código HTTP 400. - Si el id del creador no existe retornar un código HTTP 404. - Retornar la información del desafío creado. - En el header retorna el path para obtener el desafío. - Solo el rol MENTOR puede crear un desafío. - Si la creación fue exitosa retornar un 201. |
| GET | /challenges |
- Retorno paginado. - Por defecto el tamaño de la página es de 10. - Por defecto el ordenamiento es por el id. |
| GET | /challenges/{id} |
- Si el desafío no existe retornar un código HTTP 404. |
| UPDATE | /challenges/{id} |
- Si el desafío no existe retornar un código HTTP 404. - Si algún campo obligatorio no se completa retornar un 400. - Si el usuario relacionado al id del creador no existe retornar un 404. |
| DELETE | /challenges/{id} |
- Si el desafío no existe retornar un código HTTP 404. - Si la eliminación es exitosa retornar un 204. - Realizar una eliminación lógica. |
📝 Evaluaciones
| Método | Endpoint | Reglas de negocio |
|---|---|---|
| POST | /evaluations |
- Si algún campo obligatorio no se completa retornar un código HTTP 400. - El puntaje debe estar en el rango de 1 a 5. - Si el usuario relacionado al id del evaluador no existe retornar un 404. - Si el usuario relacionado al id del evaluado no existe retornar un 404. - Si el desafío relacionado al id del mismo no existe retornar un 404. - Si la creación fue exitosa retornar la información de la evaluación. - Si la creación fue exitosa en la cabecera indicar la URI al nuevo recurso. - Si la creación fue exitosa retornar un 201. |
| GET | /evaluations |
- Retorno paginado. - Por defecto el tamaño de la página es de 10. - Por defecto el ordenamiento es por el id. |
| GET | /evaluations/{id} |
- Si la evaluación no existe retornar un 404. |
| UPDATE | /evaluations/{id} |
- Si algún campo obligatorio no se completa retornar un código HTTP 400. - El puntaje debe estar en el rango de 1 a 5. - Si la evaluación no existe retornar un 404. - Si el usuario relacionado al id del evaluador no existe retornar un 404. - Si el usuario relacionado al id del evaluado no existe retornar un 404. - Si el desafío relacionado al id del mismo no existe retornar un 404. - Si la edición fue exitosa retornar la información de la evaluación. |
| DELETE | /evaluations/{id} |
- Si la evaluación no existe retornar un código HTTP 404. - Si la eliminación es exitosa retornar un 204. - Realizar una eliminación lógica. |
💼 Proyectos
| Método | Endpoint | Reglas de negocio |
|---|---|---|
| POST | /projects |
- Si algún campo obligatorio no se completa mostrar un error 400. - Si el usuario relacionado al id del creador no existe retornar un 404. - Si algún correo del lista de miembros no existe como aprendiz retornar un 404. - Si algún id del lista de categorías no existe retornar un 404. - Si la creación fue exitosa retornar un 201. - Si la creación fue exitosa en la cabecera indicar la URI al nuevo recurso. |
| GET | /projects |
- Retorno paginado. - Por defecto el tamaño de la página es de 10. - Por defecto el ordenamiento es por el id. |
| GET | /projects/{id} |
- Si el proyecto no existe retornar un 404. |
| UPDATE | /projects/{id} |
- Si el proyecto no existe retornar un 404. - Si algún campo obligatorio no se completa mostrar un error 400. - Si el usuario relacionado al id del creador no existe retornar un 404. - Si algún correo del lista de miembros no existe retornar un 404. - Si algún id del lista de categorías no existe retornar un 404. |
| DELETE | /projects/{id} |
- Si el proyecto no existe retornar un código HTTP 404. - Si la eliminación es exitosa retornar un 204. - Realizar una eliminación lógica. |
- JDK: Java 21 o superior
- Gestor de dependencias: Maven 4.0.0
- Spring Boot 3.3.5
- Base de datos MySQL o PostgreSQL (cambiar la configuración de application.properties)
-
Clona el repositorio
git clone https://github.com/Luiggi-piero/konecta-backend.git cd konecta-backend -
Configura las variables de entorno para la conexión a la base de datos desde
application-prod.ymlspring: datasource: url: ${DB_URL:jdbc:postgresql://localhost:5432/konecta} username: ${DB_USER} password: ${DB_PASS} driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: update show-sql: true server: port: 8080 konecta: cors: allowed-origins: "*" allowed-methods: "GET,POST,PUT,DELETE,OPTIONS" allowed-headers: "*" security: secret: ${JWT_SECRET} # Get from env vars expiration-ms: ${JWT_EXPIRATION_MS:86400000}
-
Crea un base de datos vacía con el nombre konecta
-
Ejecuta el proyecto
-
La aplicación estará disponible en: http://localhost:8080
Swagger está configurado para generar documentación de la API automáticamente. Puedes acceder a la interfaz de Swagger en la siguiente URL cuando el servidor esté en funcionamiento:
http://localhost:8080/swagger-ui/index.html
- Spring Boot: Desarrollo rápido y robusto de aplicaciones.
- Spring Security y JWT: Autenticación segura.
- MySQL y postgreSQL: Sistema de gestión de bases de datos relacional.
Arquitectura basada en paquetes funcionales, se organizan las carpetas de acuerdo con las características o módulos de la aplicación (por ejemplo, auth, category, challenge), es un diseño entre aspectos funcionales y principios de Clean Architecture y este tipo de arquitectura agrupa cada módulo con sus propios componentes como controladores, servicios, repositorios y modelos.
src
└── main
├── java/com/example/skilllinkbackend
│ ├── config
│ | ├── exceptions -> Exception handling.
| | ├── responses -> Response format.
| | ├── security -> Security settings.
| | └── springdoc -> Spring doc configuration.
│ ├── features
│ | ├── auth -> Authentication.
| | ├── category
| | | ├── controller -> REST controllers.
| | | ├── dto -> Data transfer object layer.
| | | ├── model -> Domain feature layer.
| | | ├── repository -> Data persistence layer.
| | | └── service -> Business logic layer.
| | ├── challenge
| | ├── evaluation
| | ├── project
| | | ├── controller -> REST controllers.
| | | ├── dto -> Data transfer object layer.
| | | ├── model -> Domain feature layer.
| | | ├── repository -> Data persistence layer.
| | | ├── service -> Business logic layer.
| | | └── validations -> Creation and editing validations.
| | ├── mentor
| | ├── mentee
| | ├── role
| | └── usuario
| └── shared
│ ├── roledeletionhandler
| ├── roleregistrationhandler
| └── util -> Reusable items.
└── resources
└── application.properties -> Configuration app.
Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.
Important
- Con sql crea los roles: ADMIN, USER, MENTEE y MENTOR en la tabla roles
- Cambia a enabled 1 todos los roles
- Registra un usuario
- Modifica la tabla users_roles: agrega un registro para asignar al usuario creado el rol ADMIN
- Agrega la configuración de la bd en
application-prod.yml - Para aquellos que no tienen la zona horaria GMT-5 modificar el archivo ...TokenService (para indicar la expiración del token)
