{"id":31593038,"url":"https://github.com/femcoders-sitme/sitme","last_synced_at":"2025-10-06T03:36:45.673Z","repository":{"id":314272258,"uuid":"1054068065","full_name":"femcoders-sitme/sitme","owner":"femcoders-sitme","description":"SitMe is a smart backend system for managing table and meeting room reservations within companies. Built with Java 21, Spring Boot, and MySQL, it provides secure JWT authentication, role-based access, concurrency management, and admin tools for efficient reservation policies.","archived":false,"fork":false,"pushed_at":"2025-09-29T08:16:03.000Z","size":278,"stargazers_count":3,"open_issues_count":49,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-29T09:22:58.138Z","etag":null,"topics":["cloudinary","docker","docker-compose","github-actions","h2-database","hibernate-validator","java","jwt-authentication","mailhog-docker","maven","mockito-junit-test","mysql-database","spring-data-jpa","spring-security","springboot","swagger","test-automation"],"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/femcoders-sitme.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-10T10:15:56.000Z","updated_at":"2025-09-29T08:16:06.000Z","dependencies_parsed_at":"2025-09-29T09:24:11.306Z","dependency_job_id":null,"html_url":"https://github.com/femcoders-sitme/sitme","commit_stats":null,"previous_names":["femcoders-sitme/sitme"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/femcoders-sitme/sitme","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/femcoders-sitme%2Fsitme","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/femcoders-sitme%2Fsitme/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/femcoders-sitme%2Fsitme/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/femcoders-sitme%2Fsitme/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/femcoders-sitme","download_url":"https://codeload.github.com/femcoders-sitme/sitme/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/femcoders-sitme%2Fsitme/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278556225,"owners_count":26006079,"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","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["cloudinary","docker","docker-compose","github-actions","h2-database","hibernate-validator","java","jwt-authentication","mailhog-docker","maven","mockito-junit-test","mysql-database","spring-data-jpa","spring-security","springboot","swagger","test-automation"],"created_at":"2025-10-06T03:36:08.227Z","updated_at":"2025-10-06T03:36:45.666Z","avatar_url":"https://github.com/femcoders-sitme.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SitMe - Workspace Reservation System\n\n![Java](https://img.shields.io/badge/Java-21-orange?logo=java\u0026logoColor=white)\n![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5.5-brightgreen?logo=springboot\u0026logoColor=white)\n![MySQL](https://img.shields.io/badge/MySQL-8.0-blue?logo=mysql\u0026logoColor=white)\n![Docker](https://img.shields.io/badge/Docker-Supported-2496ED?logo=docker\u0026logoColor=white)\n![GitHub Actions](https://img.shields.io/badge/CI-GitHub%20Actions-purple?logo=githubactions\u0026logoColor=white)\n![License](https://img.shields.io/badge/License-Educational-yellow)\n\n**SitMe** is a Spring Boot application for managing workspace reservations, built with modern Java technologies and containerized with Docker.\n\n\u003cbr\u003e\n\n## 📑 Table of Contents\n\n- [🚀 Features](#-features)\n- [🛠️ Tech Stack](#tech-stack)\n- [📋 Prerequisites](#-prerequisites)\n- [🏗️ Project Structure](#project-structure)\n- [⚙️ Configuration](#configuration)\n- [🚀 Getting Started](#-getting-started)\n- [🧪 Testing](#-testing)\n- [📚 API Documentation](#-api-documentation)\n- [🔧 Key Features](#-key-features)\n- [🐳 Docker Support](#-docker-support)\n- [🔄 CI/CD Pipeline](#-cicd-pipeline)\n- [📝 API Usage Examples](#-api-usage-examples)\n- [🤝 Contributing](#-contributing)\n- [👩‍💻 Team](#team)\n- [📄 License](#-license)\n- [🆘 Support](#-support)\n\n\u003cbr\u003e\n\n\n## 🚀 Features\n\n- **User Management**: Registration, authentication, and profile management with JWT tokens\n- **Space Management**: Create and manage different types of workspaces (rooms and tables)\n- **Reservation System**: Book spaces for different time slots (morning, afternoon, full day)\n- **Image Upload**: Profile and space images via Cloudinary integration\n- **Email Notifications**: Automated registration confirmation emails\n- **Role-based Security**: Admin and user roles with different permissions\n- **RESTful API**: Comprehensive REST endpoints with Swagger documentation\n- **Database Integration**: MySQL with JPA/Hibernate\n- **Health Checks**: Actuator endpoints to monitor application status\n- **Containerization**: Full Docker support with multi-stage builds\n\n\u003cbr\u003e\n\n\u003ch2 id=\"tech-stack\"\u003e🛠️ Tech Stack\u003c/h2\u003e\n\n- **Backend**: Java 21, Spring Boot 3.5.5\n- **Database**: MySQL 8.0\n- **Security**: Spring Security with JWT authentication\n- **Image Storage**: Cloudinary\n- **Email**: Spring Mail (configured for MailHog in development)\n- **Testing**: JUnit, Mockito\n- **API Documentation**: Swagger/OpenAPI 3\n- **Containerization**: Docker, Docker Compose\n- **Build Tool**: Maven\n- **CI/CD**: GitHub Actions\n\n\u003cbr\u003e\n\n## 📋 Prerequisites\n\n- Java 21\n- Maven 3.9+\n- Docker and Docker Compose\n- MySQL 8.0 (if running locally without Docker)\n\n\u003cbr\u003e\n\n\u003ch2 id=\"project-structure\"\u003e🏗️ Project Structure\u003c/h2\u003e\n\n```\nsrc/\n├── main/java/com/femcoders/sitme/\n│   ├── cloudinary/          # Image upload service\n│   ├── email/               # Email notifications\n│   ├── reservation/         # Reservation management\n│   ├── security/            # JWT security configuration\n│   ├── shared/              # Common utilities and exceptions\n│   ├── space/               # Workspace management\n│   └── user/                # User management and authentication\n└── main/resources/\n    ├── application.properties\n    └── data.sql             # Initial data setup\n```\n\n\u003cbr\u003e\n\n\u003ch2 id=\"configuration\"\u003e⚙️ Configuration\u003c/h2\u003e\n\n### Environment Variables\n\nCreate a `.env` file in the project root:\n\n```env\n# Database Configuration\nDB_URL=jdbc:mysql://localhost:3306/sitme\nDB_USERNAME=your_db_username\nDB_PASSWORD=your_db_password\n\n# JWT Configuration\nJWT_SECRET_KEY=your_jwt_secret_key\nJWT_EXPIRATION=1800000\n\n# Server Configuration\nSERVER_PORT=8080\n\n# Cloudinary Configuration (for image uploads)\nCLOUDINARY_NAME=your_cloudinary_name\nCLOUDINARY_KEY=your_cloudinary_api_key\nCLOUDINARY_SECRET=your_cloudinary_secret\n\n# Docker Hub (for CI/CD)\nDOCKER_USERNAME=your_docker_username\nDOCKER_PASSWORD=your_docker_password\n```\n\n\u003cbr\u003e\n\n## 🚀 Getting Started\n\n### Option 1: Using Docker Compose (Recommended)\n\n1. **Clone the repository**:\n   ```bash\n   git clone \u003crepository-url\u003e\n   cd sitme\n   ```\n\n2. **Start the application**:\n   ```bash\n   docker-compose up -d\n   ```\n\n3. **Access the application**:\n    - API: http://localhost:8081\n    - Database: localhost:3306\n    - Swagger Documentation: http://localhost:8081/swagger-ui.html\n\n### Option 2: Local Development\n\n1. **Install dependencies**:\n   ```bash\n   mvn clean install\n   ```\n\n2. **Run the application**:\n   ```bash\n   mvn spring-boot:run\n   ```\n\n3. **Access the application**:\n    - API: http://localhost:8080\n    - Swagger Documentation: http://localhost:8080/swagger-ui.html\n\n\u003cbr\u003e\n\n## 🧪 Testing\n\n### Run Unit Tests\n```bash\nmvn test\n```\n\n### Run Integration Tests with Docker\n```bash\ndocker-compose -f docker-compose-test.yml up --abort-on-container-exit\n```\n\nThe test suite includes:\n- Unit tests for all service layers using Mockito\n- Integration tests for REST endpoints\n\n\u003cbr\u003e\n\n## 📚 API Documentation\n\n### Authentication Endpoints\n\n- `POST /api/auth/register` - User registration\n- `POST /api/auth/login` - User login (returns JWT token)\n\n### User Management\n\n- `GET /api/users/{id}` - Get user by ID (Admin only)\n- `PUT /api/users/{id}` - Update user profile (Admin only)\n- `POST /api/users/{id}/image` - Upload user profile image\n- `DELETE /api/users/{id}/image` - Delete user profile image\n\n### Space Management\n\n- `GET /api/spaces` - Get all spaces\n- `GET /api/spaces/filter/type?type={TYPE}` - Filter spaces by type (ROOM/TABLE)\n- `GET /api/spaces/filter/available` - Get available spaces only\n- `POST /api/spaces` - Create new space (Admin only)\n- `PUT /api/spaces/{id}` - Update space (Admin only)\n- `DELETE /api/spaces/{id}` - Delete space (Admin only)\n\n### Reservation Management\n\n- `GET /api/reservations` - Get all reservations (Admin only)\n- `GET /api/reservations/{id}` - Get reservation by ID (Admin only)\n\n### Default Users\n\nThe application comes with preloaded test data:\n\n- **Admin**: username: `admin`, password: `Password123.`\n- **Test Users**: username: `debora`, `roberto`, `jenni`, etc. (password: `Password123.`)\n\n\u003cbr\u003e\n\n## 🔧 Key Features\n\n### Security\n- JWT-based authentication\n- Role-based authorization (USER/ADMIN roles)\n- Password encryption with BCrypt\n- CORS configuration for API access\n\n### Observability\n- Spring Boot Actuator integration for health checks and monitoring endpoints\n\n### Image Management\n- Cloudinary integration for image storage\n- File validation (size and format)\n- Automatic cleanup when images are deleted\n\n### Email System\n- Registration confirmation emails\n- Configurable SMTP settings\n- MailHog integration for development\n\n### Database\n- MySQL with JPA/Hibernate\n- Automatic schema creation\n- Pre-loaded test data\n- Connection pooling\n\n\u003cbr\u003e\n\n## 🐳 Docker Support\n\n### Development\n```bash\ndocker-compose up -d\n```\n\n### Testing\n```bash\ndocker-compose -f docker-compose-test.yml up --abort-on-container-exit\n```\n\n### Production Build\nThe application uses multi-stage Docker builds for optimized production images.\n\n\u003cbr\u003e\n\n## 🔄 CI/CD Pipeline\n\nGitHub Actions workflows included:\n\n- **Test**: Runs on pull requests\n- **Build**: Builds and pushes Docker images on main branch pushes\n- **Release**: Creates releases and pushes tagged images\n\n\u003cbr\u003e\n\n## 📝 API Usage Examples\n\n### Register a new user\n```bash\ncurl -X POST http://localhost:8080/api/auth/register \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"username\": \"maria\",\n    \"email\": \"maria@example.com\",\n    \"password\": \"SecurePass123!\"\n  }'\n```\n\n### Login\n```bash\ncurl -X POST http://localhost:8080/api/auth/login \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"identifier\": \"maria\",\n    \"password\": \"SecurePass123!\"\n  }'\n```\n\n### Get all spaces\n```bash\ncurl -X GET http://localhost:8080/api/spaces\n```\n\n\u003cbr\u003e\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests for new functionality\n5. Submit a pull request\n\n\u003cbr\u003e\n\n\u003ch2 id=\"team\"\u003e👩‍💻 Team\u003c/h2\u003e\n\n- **Débora Rubio** – Team Leader, Scrum Master and Developer\n- **Lara Pla** – Product Owner and Developer\n- **Mariia Sycheva** – Developer\n- **Mayleris Echezuria** – Developer\n- **Vita Poperechna** – Developer\n- **Saba Ur Rehman** – Developer\n\n\u003cbr\u003e\n\n## 📄 License\n\nThis project is part of a learning bootcamp and is intended for educational purposes.\n\n\u003cbr\u003e\n\n## 🆘 Support\n\nFor questions or issues, please create an issue in the repository or contact the development team.\n\n\u003cbr\u003e\n\n---\n\n**Built with 💜 using Spring Boot and modern Java technologies**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffemcoders-sitme%2Fsitme","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffemcoders-sitme%2Fsitme","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffemcoders-sitme%2Fsitme/lists"}