OpenSpace Manager is a backend application built with Java and Spring Boot. Its primary purpose is to manage flexible office spaces, specifically focused on handling:
- Companies
- Offices
- Floors (within offices)
- Desks
- Bookings (employees booking desks)
- Users (Employees and Admins)
The system is designed to serve as a REST API for a frontend application (e.g., React/Vue) or mobile app that allows employees to reserve work spots and administrators to manage the layout and resources.
- Language: Java 17 (as per
pom.xml) - Framework: Spring Boot 4.0.1 (Experimental/Custom)
- Build Tool: Maven
- Database: PostgreSQL (Runtime), H2 (Test)
- Persistence: Spring Data JPA (Hibernate)
- Security: Spring Security with JWT (JSON Web Tokens) for authentication and authorization.
- Real-time: WebSockets (STOMP)
- Validation: Java Bean Validation (Hibernate Validator)
- Documentation: Swagger/OpenAPI (SpringDoc 2.8.3)
- Containerization: Docker (see
docker-compose.yml) - Utilities: Lombok
- Company: The top-level entity. An organization that uses the system.
- Office: A physical building or location belonging to a Company.
- Floor: A specific level within an Office.
- Desk: A bookable unit located on a Floor. It has attributes like:
number/identifierstatus(Available, Occupied, etc.)equipment(Monitor, dual screen, etc.)
- User: Accounts for employees and admins.
- Roles:
ADMIN,USER.
- Roles:
- Booking: A reservation of a specific Desk by a User for a specific Date/Time range.
- Authentication: Users register and login to receive a JWT.
- Space Management (Admin):
- CRUD operations for Companies, Offices, Floors, and Desks.
- Define desk capacity and layout.
- Booking System (User):
- Search for available desks by date and location.
- Create, View, and Cancel bookings.
- Validation rules (e.g., cannot book an occupied desk, user cannot have overlapping bookings).
- Real-time updates via WebSockets.
- Data Seeding: Contains a
DataSeederto populate the database with initial demo data (admin user, sample offices, etc.) on startup. - Error Handling: Global exception handling (
GlobalExceptionHandler) to return standardized JSON error responses.
src/main/java/com/openspace/manager:config/: Security config, CORS, Seeders, Global Exception handlers.controller/: REST endpoints (API layer).service/: Business logic.repository/: Database interactions (Interfaces extending JpaRepository).model/orentity/: JPA Entities mapping to DB tables.dto/: Data Transfer Objects for API requests/responses (e.g.,DeskRequest,LoginRequest).security/: JWT filters, UserDetails implementation.
Como el proyecto utiliza una arquitectura de microservicios, la forma más sencilla de arrancar el backend en local (con tus propias bases de datos aisladas) es usar Docker Compose.
- Tener Docker Desktop o Docker Engine instalado y ejecutándose.
- Tener Java 17 y Maven instalados (opcional si usas el wrapper
mvnw).
En la raíz del proyecto, ejecuta el siguiente comando para levantar la base de datos PostgreSQL, Redis, RabbitMQ, Zipkin, Prometheus y Grafana de golpe:
docker-compose up -d(Nota: El archivo application.yml está configurado por defecto para apuntar a localhost y a los puertos estándar expuestos por estos contenedores).
Con la infraestructura viva, arranca tu servidor Java:
./mvnw spring-boot:runEste proyecto está preparado para desplegarse en la nube 100% gratis utilizando una combinación de servicios Serverless y PaaS.
La arquitectura en producción inyecta variables de entorno para reemplazar el localhost y apuntar a estos servicios en la nube:
Si necesitas revisar el estado de la base de datos, ver los datos de Redis o reiniciar el backend, utiliza los siguientes enlaces:
- 🐘 Base de Datos Principal (PostgreSQL Serverless): Alojada en Neon.tech
- ⚡ Caché / Lock System (Redis Serverless): Alojado en Upstash
- 🐇 Message Broker (RabbitMQ): Alojado en CloudAMQP
- ☁️ Servidor del Backend (Spring Boot Web Service): Alojado y desplegado en Render.com (Incluye los Logs en vivo del servidor)
Si por alguna razón se pierden los servicios actuales, estos son los pasos para levantarlo de nuevo en los mismos proveedores:
- Código fuente:
Asegúrate de que el repositorio en GitHub tenga el
Dockerfileen el directorio raíz. - Preparar los servicios satélite: Crea bases de datos gratuitas en Neon, Upstash y CloudAMQP. Extrae los credenciales de los paneles de control.
- Desplegar el Backend: Abre una cuenta en Render, crea un "Web Service", vincúlalo a este repositorio Git y elige el plan "Free" (0$/mes).
- Inyectar Secretos (.env):
En la pestaña Environment de Render, inyecta las variables contenidas en el archivo
.envdel proyecto con tus credenciales actualizadas (sustituyendo las actuales):SPRING_DATASOURCE_URL,SPRING_DATASOURCE_USERNAME,SPRING_DATASOURCE_PASSWORDSPRING_REDIS_HOST,SPRING_REDIS_PORT,SPRING_REDIS_PASSWORD,SPRING_REDIS_SSL=trueSPRING_RABBITMQ_HOST,SPRING_RABBITMQ_PORT,SPRING_RABBITMQ_VIRTUAL_HOST,SPRING_RABBITMQ_USERNAME,SPRING_RABBITMQ_PASSWORD,SPRING_RABBITMQ_SSL_ENABLED=trueMANAGEMENT_TRACING_ENABLED=false(Para evitar el colapso de RAM en el plan gratuito).
- Login as Admin (
admin@openspace.com/admin123) to get a Token. - Create Structure: Create Company, Office, and Floor via
/api/structure/.... - Create Desk: POST to
/api/deskslinked to a Floor. - Book: POST to
/api/bookings(Creates a LOCK). - Confirm: POST to
/api/bookings/{id}/confirmwithin 5 minutes.
Connect to /ws. Subscribe to /topic/bookings for live updates on locks and unlocks.