{"id":29182552,"url":"https://github.com/luiggi-piero/roles-prueba2","last_synced_at":"2026-04-18T15:36:42.479Z","repository":{"id":302166009,"uuid":"1011368941","full_name":"Luiggi-piero/roles-prueba2","owner":"Luiggi-piero","description":"Backend para la administración de usuarios, roles, categorias, proyectos, desafios y evaluaciones","archived":false,"fork":false,"pushed_at":"2025-06-30T23:28:27.000Z","size":37,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-30T23:32:12.924Z","etag":null,"topics":["java-21","postgresql","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Luiggi-piero.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-30T17:53:11.000Z","updated_at":"2025-06-30T23:28:30.000Z","dependencies_parsed_at":"2025-06-30T23:32:15.862Z","dependency_job_id":"4f88d7fe-0c2e-42e4-b740-041de185b8fa","html_url":"https://github.com/Luiggi-piero/roles-prueba2","commit_stats":null,"previous_names":["luiggi-piero/roles-prueba2"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Luiggi-piero/roles-prueba2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luiggi-piero%2Froles-prueba2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luiggi-piero%2Froles-prueba2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luiggi-piero%2Froles-prueba2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luiggi-piero%2Froles-prueba2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Luiggi-piero","download_url":"https://codeload.github.com/Luiggi-piero/roles-prueba2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Luiggi-piero%2Froles-prueba2/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263029214,"owners_count":23402354,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java-21","postgresql","spring-boot"],"created_at":"2025-07-01T20:06:40.811Z","updated_at":"2026-04-18T15:36:37.445Z","avatar_url":"https://github.com/Luiggi-piero.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## \u003cp align=\"center\"\u003e ROLES PRUEBA 2\u003c/p\u003e\n\nAPI Rest desarrollada en Java con Spring Boot para la gestión de usuarios(login y registro), roles, desafíos, evaluaciones, categorias y proyectos.\n\n\n## Índice\n\n1. [Funcionalidades](#Funcionalidades)\n2. [Requerimientos previos](#requerimientos-previos)\n3. [Configuración](#configuración)\n4. [Tecnologías utilizadas](#tecnologías-utilizadas)\n5. [Estructura del proyecto](#estructura-del-proyecto)\n6. [Modelo entidad-relación](#modelo-entidad-relación)\n\n\n## Funcionalidades\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003e🔐 Autenticación\u003c/summary\u003e\n\n| Método | Endpoint | Reglas de negocio |\n|--------|----------|-------------------|\n| POST   | `/login` | Inicia sesión y obtiene un Token JWT. |\n\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003e👤 Usuarios\u003c/summary\u003e\n\n| Método | Endpoint          | Reglas de negocio |\n|--------|-------------------|-------------------|\n| POST   | `/users/register` | - Todos los campos son obligatorios, por lo tanto, es necesario verificar si todos los campos se están ingresando correctamente.\u003cbr\u003e- 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.\u003cbr\u003e- Asignar el rol USER por defecto.\u003cbr\u003e- La API debe retornar la información del nuevo usuario y el token. |\n| GET    | `/users`          | - Retornar los primeros 10 resultados ordenados por id.\u003cbr\u003e- Devolver todos los atributos menos la contraseña.\u003cbr\u003e- Obtener la respuesta con paginación para controlar el volumen de los datos.\u003cbr\u003e- Solo el rol ADMIN puede obtener todos los usuarios. |\n\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003e🗂️ Categorías de Proyectos\u003c/summary\u003e\n\n| Método  | Endpoint                | Reglas de negocio |\n|---------|-------------------------|-------------------|\n| POST    | `/categories`           | - Retornar la información de la categoría creada.\u003cbr\u003e- En el header retorna el path para obtener la categoría.\u003cbr\u003e- Si el nombre no se completa mostrar un error 400.\u003cbr\u003e- Si la creación fue exitosa retornar un 201. |\n| GET     | `/categories`           | - Lectura paginada de los registros.\u003cbr\u003e- Por defecto el tamaño de la página es de 10.\u003cbr\u003e- Por defecto el ordenamiento es por id. |\n| GET     | `/categories/{id}`      | - Si la categoría no existe retornar un 404. |\n| UPDATE  | `/categories/{id}`      | - Si la categoría no existe retornar un 404.\u003cbr\u003e- Si el nombre no se completa mostrar un error 400. |\n| DELETE  | `/categories/{id}`      | - Si la categoría no existe retornar un un código HTTP 404.\u003cbr\u003e- Si la eliminación fue exitosa retornar un código HTTP 204 No Content.\u003cbr\u003e- Realizar una eliminación lógica. |\n\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003e🎯 Desafíos\u003c/summary\u003e\n\n| Método  | Endpoint              | Reglas de negocio |\n|---------|-----------------------|-------------------|\n| POST    | `/challenges`         | - Si algún campo obligatorio no se completa retornar un código HTTP 400.\u003cbr\u003e- Si el id del creador no existe retornar un código HTTP 404.\u003cbr\u003e- Retornar la información del desafío creado.\u003cbr\u003e- En el header retorna el path para obtener el desafío.\u003cbr\u003e- Solo el rol MENTOR puede crear un desafío.\u003cbr\u003e- Si la creación fue exitosa retornar un 201. |\n| GET     | `/challenges`         | - Retorno paginado.\u003cbr\u003e- Por defecto el tamaño de la página es de 10.\u003cbr\u003e- Por defecto el ordenamiento es por el id. |\n| GET     | `/challenges/{id}`    | - Si el desafío no existe retornar un código HTTP 404. |\n| UPDATE  | `/challenges/{id}`    | - Si el desafío no existe retornar un código HTTP 404.\u003cbr\u003e- Si algún campo obligatorio no se completa retornar un 400.\u003cbr\u003e- Si el usuario relacionado al id del creador no existe retornar un 404. |\n| DELETE  | `/challenges/{id}`    | - Si el desafío no existe retornar un código HTTP 404.\u003cbr\u003e- Si la eliminación es exitosa retornar un 204.\u003cbr\u003e- Realizar una eliminación lógica. |\n\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003e📝 Evaluaciones\u003c/summary\u003e\n\n| Método  | Endpoint                  | Reglas de negocio |\n|---------|---------------------------|-------------------|\n| POST    | `/evaluations`            | - Si algún campo obligatorio no se completa retornar un código HTTP 400.\u003cbr\u003e- El puntaje debe estar en el rango de 1 a 5.\u003cbr\u003e- Si el usuario relacionado al id del evaluador no existe retornar un 404.\u003cbr\u003e- Si el usuario relacionado al id del evaluado no existe retornar un 404.\u003cbr\u003e- Si el desafío relacionado al id del mismo no existe retornar un 404.\u003cbr\u003e- Si la creación fue exitosa retornar la información de la evaluación.\u003cbr\u003e- Si la creación fue exitosa en la cabecera indicar la URI al nuevo recurso.\u003cbr\u003e- Si la creación fue exitosa retornar un 201. |\n| GET     | `/evaluations`            | - Retorno paginado.\u003cbr\u003e- Por defecto el tamaño de la página es de 10.\u003cbr\u003e- Por defecto el ordenamiento es por el id. |\n| GET     | `/evaluations/{id}`       | - Si la evaluación no existe retornar un 404. |\n| UPDATE  | `/evaluations/{id}`       | - Si algún campo obligatorio no se completa retornar un código HTTP 400.\u003cbr\u003e- El puntaje debe estar en el rango de 1 a 5.\u003cbr\u003e- Si la evaluación no existe retornar un 404.\u003cbr\u003e- Si el usuario relacionado al id del evaluador no existe retornar un 404.\u003cbr\u003e- Si el usuario relacionado al id del evaluado no existe retornar un 404.\u003cbr\u003e- Si el desafío relacionado al id del mismo no existe retornar un 404.\u003cbr\u003e- Si la edición fue exitosa retornar la información de la evaluación. |\n| DELETE  | `/evaluations/{id}`       | - Si la evaluación no existe retornar un código HTTP 404.\u003cbr\u003e- Si la eliminación es exitosa retornar un 204.\u003cbr\u003e- Realizar una eliminación lógica. |\n\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003e💼 Proyectos\u003c/summary\u003e\n\n| Método  | Endpoint              | Reglas de negocio |\n|---------|-----------------------|-------------------|\n| POST    | `/projects`           | - Si algún campo obligatorio no se completa mostrar un error 400.\u003cbr\u003e- Si el usuario relacionado al id del creador no existe retornar un 404.\u003cbr\u003e- Si algún correo del lista de miembros no existe retornar un 404.\u003cbr\u003e- Si algún id del lista de categorías no existe retornar un 404.\u003cbr\u003e- Si la creación fue exitosa retornar un 201.\u003cbr\u003e- Si la creación fue exitosa en la cabecera indicar la URI al nuevo recurso. |\n| GET     | `/projects`           | - Retorno paginado.\u003cbr\u003e- Por defecto el tamaño de la página es de 10.\u003cbr\u003e- Por defecto el ordenamiento es por el id. |\n| GET     | `/projects/{id}`      | - Si el proyecto no existe retornar un 404. |\n| POST    | `/projects/{id}`      | - Si el proyecto no existe retornar un 404.\u003cbr\u003e- Si algún campo obligatorio no se completa mostrar un error 400.\u003cbr\u003e- Si el usuario relacionado al id del creador no existe retornar un 404.\u003cbr\u003e- Si algún correo del lista de miembros no existe retornar un 404.\u003cbr\u003e- Si algún id del lista de categorías no existe retornar un 404. |\n| DELETE  | `/projects/{id}`      | - Si el proyecto no existe retornar un código HTTP 404.\u003cbr\u003e- Si la eliminación es exitosa retornar un 204.\u003cbr\u003e- Realizar una eliminación lógica. |\n\n\u003c/details\u003e\n\n\n## Requerimientos previos\n\n- **JDK: Java 17 o superior**\n- **Gestor de dependencias: Maven 4.0.0**\n- **Spring Boot 3.5.0**\n- **Base de datos MySQL o PostgreSQL (cambiar la configuración de application.properties)**\n\n## Configuración \n\n  1. Clona el repositorio\n     \n     ```bash\n     git clone https://github.com/Luiggi-piero/roles-prueba2.git\n     cd roles-prueba2\n  2. Configura las variables de entorno para la conexión a la base de datos\n\n     ```yaml\n     spring.application.name=rolesprueba\n     spring.jpa.hibernate.ddl-auto=update\n\n     #spring.datasource.url=jdbc:mysql://localhost:3306/rolesprueba?useSSL=false\u0026serverTimezone=UTC\n     #conexion con postgresql\n     spring.datasource.url=jdbc:postgresql://localhost:5432/rolesprueba2_db\n     spring.datasource.driver-class-name=org.postgresql.Driver\n\n     spring.datasource.username=${DB_USERNAME}\n     spring.datasource.password=${DB_PASSWORD}\n     api.security.secret=${JWT_SECRET}\n\n  3. Crea un base de datos vacía con el nombre rolesprueba2_db\n  \n  4. Ejecuta el proyecto\n\n  5. La aplicación estará disponible en: http://localhost:8080\n\n\n## Tecnologías utilizadas\n\n- **Spring Boot**: Desarrollo rápido y robusto de aplicaciones.\n- **Spring Security y JWT**: Autenticación segura.\n- **MySQL y postgreSQL**: Sistema de gestión de bases de datos relacional.          \n\n\n## Estructura del proyecto\n\nArquitectura 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.\n\n      src\n      └── main\n          ├── java/com/example/skilllinkbackend\n          │   ├── config       \n          │   |   ├── exceptions       -\u003e Exception handling.\n          |   |   ├── responses        -\u003e Response format.\n          |   |   └── security         -\u003e Security settings.\n          │   ├── features\n          │   |   ├── auth             -\u003e Authentication.\n          |   |   ├── category\n          |   |   |   ├── controller   -\u003e REST controllers.\n          |   |   |   ├── dto          -\u003e Data transfer object layer.\n          |   |   |   ├── model        -\u003e Domain feature layer.\n          |   |   |   ├── repository   -\u003e Data persistence layer.\n          |   |   |   └── service      -\u003e Business logic layer.\n          |   |   ├── challenge   \n          |   |   ├── evaluation  \n          |   |   ├── project\n          |   |   |   ├── controller   -\u003e REST controllers.\n          |   |   |   ├── dto          -\u003e Data transfer object layer.\n          |   |   |   ├── model        -\u003e Domain feature layer.\n          |   |   |   ├── repository   -\u003e Data persistence layer.\n          |   |   |   ├── service      -\u003e Business logic layer. \n          |   |   |   └── validations  -\u003e Creation and editing validations.      \n          |   |   ├── role   \n          |   |   └── usuario   \n          └── resources\n              └── application.properties -\u003e Configuration app.\n        \n\n## Modelo Entidad Relación\n![Image](https://github.com/user-attachments/assets/40b0faa5-45e0-4032-b767-053adccf1fb5)\n\n\u003c/br\u003e\n\n\u003e [!IMPORTANT]\n\u003e * Con sql crea los roles: ADMIN, USER, MENTEE y MENTOR en la tabla roles\n\u003e * Cambia a enabled 1 todos los roles\n\u003e * Registra un usuario\n\u003e * Modifica la tabla users_roles: agrega un registro para asignar al usuario creado el rol ADMIN\n\u003e * Agrega la configuración de la bd en application.properties\n\u003e * Para aquellos que no tienen la zona horaria GMT-5 modificar el archivo ...TokenService (para indicar la expiración del token)\n         \n\n\u003c/br\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/java-white?style=for-the-badge\u0026logo=openjdk\u0026logoColor=white\u0026labelColor=black\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/SPRINGBOOT-white?style=for-the-badge\u0026logo=spring\u0026logoColor=white\u0026labelColor=%236DB33F\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/mysql-white?style=for-the-badge\u0026logo=mysql\u0026logoColor=white\u0026labelColor=4169E1\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/postgresql-white?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\u0026labelColor=4169E1\"\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluiggi-piero%2Froles-prueba2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluiggi-piero%2Froles-prueba2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluiggi-piero%2Froles-prueba2/lists"}