An open API service indexing awesome lists of open source software.

https://github.com/luiggi-piero/roles-prueba2

Backend para la administración de usuarios, roles, categorias, proyectos, desafios y evaluaciones
https://github.com/luiggi-piero/roles-prueba2

java-21 postgresql spring-boot

Last synced: 3 months ago
JSON representation

Backend para la administración de usuarios, roles, categorias, proyectos, desafios y evaluaciones

Awesome Lists containing this project

README

          

##

ROLES PRUEBA 2

API Rest desarrollada en Java con Spring Boot para la gestión de usuarios(login y registro), roles, desafíos, evaluaciones, categorias y proyectos.

## Índice

1. [Funcionalidades](#Funcionalidades)
2. [Requerimientos previos](#requerimientos-previos)
3. [Configuración](#configuración)
4. [Tecnologías utilizadas](#tecnologías-utilizadas)
5. [Estructura del proyecto](#estructura-del-proyecto)
6. [Modelo entidad-relación](#modelo-entidad-relación)

## Funcionalidades

🔐 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` | - Todos los campos son obligatorios, por lo tanto, es necesario verificar si todos los campos 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. |
| 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. |

🗂️ 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 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. |
| POST | `/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. |

## Requerimientos previos

- **JDK: Java 17 o superior**
- **Gestor de dependencias: Maven 4.0.0**
- **Spring Boot 3.5.0**
- **Base de datos MySQL o PostgreSQL (cambiar la configuración de application.properties)**

## Configuración

1. Clona el repositorio

```bash
git clone https://github.com/Luiggi-piero/roles-prueba2.git
cd roles-prueba2
2. Configura las variables de entorno para la conexión a la base de datos

```yaml
spring.application.name=rolesprueba
spring.jpa.hibernate.ddl-auto=update

#spring.datasource.url=jdbc:mysql://localhost:3306/rolesprueba?useSSL=false&serverTimezone=UTC
#conexion con postgresql
spring.datasource.url=jdbc:postgresql://localhost:5432/rolesprueba2_db
spring.datasource.driver-class-name=org.postgresql.Driver

spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
api.security.secret=${JWT_SECRET}

3. Crea un base de datos vacía con el nombre rolesprueba2_db

4. Ejecuta el proyecto

5. La aplicación estará disponible en: http://localhost:8080

## Tecnologías utilizadas

- **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.

## Estructura del proyecto

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.
│ ├── 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.
| | ├── role
| | └── usuario
└── resources
└── application.properties -> Configuration app.

## Modelo Entidad Relación
![Image](https://github.com/user-attachments/assets/40b0faa5-45e0-4032-b767-053adccf1fb5)

> [!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.properties
> * Para aquellos que no tienen la zona horaria GMT-5 modificar el archivo ...TokenService (para indicar la expiración del token)