Web platform that connects service providers with clients who need to book appointments. It lets businesses create profiles, publish services, manage available time slots, and schedule bookings by region and city.
This was one of my first complete projects as a developer. I keep it as a record of my technical growth: here I consolidated fundamentals such as layered MVC, relational persistence, form validation, and authentication using a classic server-side rendering stack (Spring Boot + JSP).
Since then, I have moved toward more modern architectures — decoupled REST APIs, SPA frontends, cloud deployment, infrastructure as code, and a stricter separation between domain, application, and infrastructure layers.
- User registration and login with hashed passwords (BCrypt)
- Business creation and management with Free and Premium plans
- Service publishing with duration, price, description, and images
- Service search by region, city, and service type
- Weekly availability calendar with booking and cancellation
- Appointment dashboard for clients and business owners
- User profile editing
Monolithic application with a layered MVC architecture. Spring Boot exposes controllers that delegate business logic to services and persistence to JPA repositories. The UI is rendered on the server with JSP and Bootstrap.
JSP (Views)
↓
Controllers (Spring MVC)
↓
Services
↓
Repositories (Spring Data JPA)
↓
MySQL
- Java 17
- Spring Boot 2.7
- Spring MVC + JSP
- Spring Data JPA / Hibernate
- MySQL
- Bootstrap 5
- Lombok
- jBCrypt
- Maven
- Docker
- Java 17
- Maven 3.6+ (or use the included wrapper
./mvnw) - MySQL 8+
- Docker (optional)
git clone https://github.com/<user>/agendalo-max.git
cd agendalo-maxSet the database environment variables:
export MYSQL_URL=jdbc:mysql://localhost:3306/proyecto_agenda
export MYSQL_USER=root
export MYSQL_PASSWORD=rootWith Maven:
./mvnw spring-boot:runWith Docker:
docker build -t agendalo-max .
docker run -p 8080:8080 \
-e MYSQL_URL=jdbc:mysql://host.docker.internal:3306/proyecto_agenda \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=root \
agendalo-maxThe application will be available at http://localhost:8080.
src/main/java/com/laurasoto/ProyectoAgenda/
├── controlador/ # MVC endpoints and routing
├── servicios/ # Business logic
├── repositorios/ # Data access (Spring Data JPA)
├── modelos/ # JPA entities
├── validator/ # Custom validators
└── utiles/ # Shared utilities
src/main/webapp/WEB-INF/ # JSP views
src/main/resources/
├── static/css/ # Stylesheets
├── static/js/ # Frontend scripts
├── application.properties # Configuration
└── messages.properties # i18n messages
- User authentication and registration
- Business and service management
- Geographic search and appointment booking
- Free and Premium plans
- Monitoring and observability
- CI/CD
- Server-side rendering with JSP: JSP was chosen over an SPA to speed up MVP development and keep presentation logic close to the backend on a small team.
- Session-based authentication: User state is managed with
HttpSession, which is sufficient for the current flow without the complexity of JWT. - Schedule calculation in the domain layer: Available slot generation lives in the
Servicioentity, which centralizes the business rule but couples complex logic to the model — a good candidate for refactoring into the service layer. - Evolutionary schema with Hibernate:
ddl-auto=updatesimplifies local development, but explicit migrations (Flyway/Liquibase) are preferable in production. - Multi-stage Docker: The container builds with JDK 17 and runs with JRE, reducing the final image size.