A production-ready, scalable e-commerce platform built with Spring Boot microservices architecture, featuring user authentication (JWT + OAuth2), product catalog management with Redis caching, Stripe payment integration, and asynchronous email notifications via Kafka.
- System Architecture
- Features
- Technology Stack
- Prerequisites
- Quick Start
- Detailed Setup
- API Endpoints
- Testing the Application
- Configuration
- Troubleshooting
- Project Structure
- Contributing
- License
%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#6366f1','primaryTextColor':'#fff','primaryBorderColor':'#4f46e5','lineColor':'#6366f1','secondaryColor':'#22c55e','tertiaryColor':'#f59e0b','background':'#ffffff','mainBkg':'#f3f4f6','secondBkg':'#e5e7eb','tertiaryBkg':'#d1d5db','textColor':'#1f2937','fontSize':'16px','fontFamily':'Inter, system-ui, sans-serif'}}}%%
graph TB
Client([π€ Client/Browser]):::clientStyle
subgraph EntryLayer["π Entry Layer"]
Gateway[API Gateway<br/>π Port: 3001<br/>π JWT Validation]:::gatewayStyle
Discovery[Service Discovery<br/>π Port: 8761<br/>π‘ Eureka Server]:::discoveryStyle
end
subgraph BusinessLayer["βοΈ Business Services Layer"]
UserService[User Service<br/>π Port: 8080<br/>π Auth & JWT]:::serviceStyle
ProductService[Product Service<br/>π Port: 8081<br/>ποΈ Catalog]:::serviceStyle
PaymentService[Payment Service<br/>π Port: 8082<br/>π³ Payments]:::serviceStyle
EmailService[Email Service<br/>π Port: 8181<br/>π§ Notifications]:::serviceStyle
end
subgraph DataLayer["πΎ Data Layer"]
PostgreSQL[(PostgreSQL<br/>Users DB)]:::dbStyle
MySQL[(MySQL<br/>Products DB)]:::dbStyle
Redis[(Redis<br/>Cache)]:::cacheStyle
end
subgraph MessageLayer["π¨ Message Queue"]
Kafka[Kafka Broker<br/>π Port: 9092]:::messageStyle
Zookeeper[Zookeeper<br/>π Port: 2181]:::messageStyle
end
subgraph ExternalLayer["π External Services"]
Google[Google OAuth2<br/>π Authentication]:::externalStyle
Stripe[Stripe API<br/>π° Payments]:::externalStyle
Gmail[Gmail SMTP<br/>βοΈ Email Delivery]:::externalStyle
end
Client ==>|All API Requests| Gateway
Gateway -.->|Service Lookup| Discovery
Gateway ==>|/api/auth/**<br/>/api/user/**| UserService
Gateway ==>|/api/products/**<br/>/api/categories/**| ProductService
Gateway ==>|/api/payments/**| PaymentService
UserService ==>|Store/Retrieve Users| PostgreSQL
ProductService ==>|CRUD Operations| MySQL
ProductService <-->|Cache Queries| Redis
UserService -->|Publish Events| Kafka
Kafka -->|Consume Events| EmailService
Kafka -.->|Coordination| Zookeeper
UserService -.->|OAuth2 Login| Google
PaymentService -.->|Process Payments| Stripe
EmailService -.->|Send Emails| Gmail
UserService -.->|Register Service| Discovery
ProductService -.->|Register Service| Discovery
PaymentService -.->|Register Service| Discovery
EmailService -.->|Register Service| Discovery
classDef clientStyle fill:#6366f1,stroke:#4f46e5,stroke-width:3px,color:#fff
classDef gatewayStyle fill:#8b5cf6,stroke:#7c3aed,stroke-width:2px,color:#fff
classDef discoveryStyle fill:#22c55e,stroke:#16a34a,stroke-width:2px,color:#fff
classDef serviceStyle fill:#3b82f6,stroke:#2563eb,stroke-width:2px,color:#fff
classDef dbStyle fill:#f59e0b,stroke:#d97706,stroke-width:2px,color:#fff
classDef cacheStyle fill:#ec4899,stroke:#db2777,stroke-width:2px,color:#fff
classDef messageStyle fill:#14b8a6,stroke:#0d9488,stroke-width:2px,color:#fff
classDef externalStyle fill:#64748b,stroke:#475569,stroke-width:2px,color:#fff
| Component | Port | Technology | Purpose |
|---|---|---|---|
| API Gateway | 3001 | Spring Cloud Gateway | Single entry point, routing, JWT validation |
| Service Discovery | 8761 | Netflix Eureka | Service registration & discovery |
| User Service | 8080 | Spring Boot, PostgreSQL | Authentication, authorization, user management |
| Product Service | 8081 | Spring Boot, MySQL, Redis | Product catalog, caching |
| Payment Service | 8082 | Spring Boot, Stripe API | Payment processing |
| Email Service | 8181 | Spring Boot, Kafka | Async email notifications |
| PostgreSQL | 5432 | PostgreSQL 15 | User data persistence |
| MySQL | 3306 | MySQL 8.0 | Product data persistence |
| Redis | 6379 | Redis | Caching layer |
| Kafka | 9092 | Apache Kafka | Message broker |
| Zookeeper | 2181 | Apache Zookeeper | Kafka coordination |
- JWT Authentication with RSA-256 signing
- OAuth2 Integration with Google Sign-In
- Multi-Authentication Support (Local + OAuth2)
- Role-Based Access Control (ADMIN, USER)
- Password Security with BCrypt hashing
- Token Expiration (1 hour by default)
- Full CRUD Operations for products and categories
- Redis Caching with 1-hour TTL for performance
- Soft Delete pattern for data retention
- Pagination & Sorting for efficient data retrieval
- Category Management with automatic creation
- Input Validation with custom constraints
- Flyway Migrations for database versioning
- Stripe Integration for secure payments
- Payment Link Generation with custom callbacks
- Multi-Gateway Support (Stripe active, Razorpay ready)
- Success/Failure Callbacks for order confirmation
- Extensible Gateway Interface for future integrations
- Kafka-Based Async Processing for scalability
- Gmail SMTP Integration with TLS
- Welcome Emails on user registration
- Customizable Templates for different events
- Retry Mechanism via Kafka consumer groups
- Centralized Routing to all microservices
- JWT Token Validation before forwarding requests
- Public Endpoint Exemptions for auth and product browsing
- Load Balancing via Eureka integration
- Request/Response Logging capabilities
- Automatic Service Registration on startup
- Health Monitoring of all services
- Client-Side Load Balancing for resilience
- Eureka Dashboard for service visualization
- Dynamic Service Location without hard-coded URLs
- Java 17 - Programming language
- Spring Boot 3.5.x - Application framework
- Spring Cloud - Microservices infrastructure
- Spring Cloud Gateway - API Gateway
- Netflix Eureka - Service Discovery
- Spring Security - Authentication & Authorization
- Spring Data JPA - Data persistence
- Hibernate - ORM framework
- PostgreSQL 15 - User service database
- MySQL 8.0 - Product service database
- Redis - Caching layer
- Apache Kafka 7.4.0 - Event streaming
- Apache Zookeeper 7.4.0 - Kafka coordination
- JWT (JSON Web Tokens) - Stateless authentication
- OAuth2 - Third-party authentication
- BCrypt - Password hashing
- RSA-256 - JWT signing algorithm
- Stripe API - Payment processing
- Google OAuth2 API - Social login
- Gmail SMTP - Email delivery
- Docker - Containerization
- Docker Compose - Multi-container orchestration
- Maven - Dependency management & build tool
- Flyway - Database migration tool
Before you begin, ensure you have the following installed:
- Docker (20.10+) and Docker Compose (2.0+)
- Java 17 (for local development without Docker)
- Maven 3.9+ (for local development)
- Git (for cloning the repository)
You'll need to create accounts and obtain API keys from:
- Google Cloud Console - For OAuth2 credentials
- Stripe - For payment processing API key
- Gmail - For SMTP email sending (App Password required)
git clone https://github.com/yourusername/ecommerce-microservices.git
cd ecommerce-microservicesCreate a .env file in the project root:
# Copy the example file
cp .env.example .envEdit .env and add your credentials:
# Google OAuth2 Credentials
GOOGLE_CLIENT_ID=your-google-client-id-here
GOOGLE_CLIENT_SECRET=your-google-client-secret-here
# Stripe API Key
STRIPE_KEY=sk_test_your-stripe-test-key-here
# Gmail SMTP Credentials
SENDER_EMAIL=your-email@gmail.com
SENDER_PASSWORD=your-gmail-app-password-hereIf you need to regenerate the keystore:
keytool -genkeypair -alias auth-server -keyalg RSA -keysize 2048 \
-keystore user-service/src/main/resources/keystore.jks \
-storepass password -validity 3650 \
-dname "CN=Auth Server, OU=Development, O=ECommerce, L=City, ST=State, C=US"
# Copy to API Gateway
cp user-service/src/main/resources/keystore.jks api-gateway/src/main/resources/# Build and start all services
docker-compose up --build
# Or run in detached mode
docker-compose up -d --build
# View logs
docker-compose logs -f
# View logs for specific service
docker-compose logs -f user-serviceWait for all services to start (approximately 2-3 minutes). You can check:
- Eureka Dashboard: http://localhost:8761
- API Gateway: http://localhost:3001
- User Service: http://localhost:8080
- Product Service: http://localhost:8081
- Payment Service: http://localhost:8082
# Health check
curl http://localhost:3001/api/test/check
# Get all products
curl http://localhost:3001/api/products/
# Get all categories
curl http://localhost:3001/api/categories/- Go to Google Cloud Console
- Create a new project or select existing one
- Navigate to APIs & Services > Credentials
- Click Create Credentials > OAuth 2.0 Client ID
- Configure consent screen if prompted
- Select Web application as application type
- Add authorized redirect URIs:
http://localhost:8080/login/oauth2/code/google http://localhost:3001/login/oauth2/code/google - Copy Client ID and Client Secret to your
.envfile
- Go to Stripe Dashboard
- Create an account or sign in
- Navigate to Developers > API Keys
- Copy your Test Mode secret key (starts with
sk_test_) - Add to
.envfile asSTRIPE_KEY
Important: Never use production keys in development!
- Enable 2-Factor Authentication on your Gmail account
- Go to Google Account Settings
- Navigate to Security > 2-Step Verification
- Scroll down to App passwords
- Generate a new app password for "Mail"
- Copy the 16-character password (remove spaces)
- Add to
.envfile asSENDER_PASSWORD
Security Note: Use app-specific passwords, never your actual Gmail password!
Each service needs an application.properties file. Examples are provided:
# User Service
cp user-service/application.properties.example user-service/src/main/resources/application.properties
# Product Service
cp product-service/src/main/resources/templates/application-template.properties \
product-service/src/main/resources/application.properties
# Email Service
cp email-service/application.properties.example \
email-service/src/main/resources/application.properties| Method | Endpoint | Description | Request Body |
|---|---|---|---|
| POST | /api/auth/register |
Register new user | {email, password, firstName, lastName, roles} |
| POST | /api/auth/login |
Login with credentials | {email, password} |
| GET | /api/auth/oauth2/success |
OAuth2 success callback | Query: token |
| GET | /api/auth/oauth2/error |
OAuth2 error callback | Query: message |
| Method | Endpoint | Required Role | Description |
|---|---|---|---|
| GET | /api/user/profile |
USER | Get current user profile |
| GET | /api/user/list |
ADMIN | List all users |
| GET | /api/user/debug-roles |
Any | Debug role information |
| Method | Endpoint | Description | Request Body/Params |
|---|---|---|---|
| GET | /api/products/ |
Get all products | - |
| GET | /api/products/{id} |
Get product by ID | - |
| POST | /api/products/ |
Create product | {title, description, price, image, categoryTitle} |
| PUT | /api/products/{id} |
Update product | {title, description, price, image, categoryTitle} |
| DELETE | /api/products/{id} |
Soft delete product | - |
| GET | /api/products/list |
Paginated products | Query: pageNumber, pageSize, sortBy, ascending |
| GET | /api/products/category/{title} |
Products by category | - |
| Method | Endpoint | Description | Request Body |
|---|---|---|---|
| GET | /api/categories/ |
Get all categories | - |
| GET | /api/categories/{id} |
Get category by ID | - |
| POST | /api/categories/ |
Create category | {title} |
| PUT | /api/categories/{id} |
Update category | {title} |
| DELETE | /api/categories/{id} |
Soft delete category | - |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /api/payments/initiatePayment/{orderId} |
JWT | Initiate Stripe payment |
| GET | /api/payments/success |
Public | Payment success callback |
curl -X POST http://localhost:3001/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "john.doe@example.com",
"password": "SecurePassword123!",
"firstName": "John",
"lastName": "Doe",
"roles": ["USER"]
}'Expected Response:
{
"email": "john.doe@example.com",
"firstName": "John",
"lastName": "Doe",
"roles": ["USER"]
}You should also receive a welcome email!
curl -X POST http://localhost:3001/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "john.doe@example.com",
"password": "SecurePassword123!"
}'Expected Response:
{
"access_token": "eyJhbGciOiJSUzI1NiJ9...",
"expires_in": 3600
}Save the access_token for subsequent requests!
curl -X POST http://localhost:3001/api/products/ \
-H "Content-Type: application/json" \
-d '{
"title": "Awesome Laptop",
"description": "High-performance laptop for developers",
"price": 1299.99,
"image": "https://example.com/laptop.jpg",
"categoryTitle": "electronics"
}'# First call - hits database
curl http://localhost:3001/api/products/
# Second call - served from Redis cache
curl http://localhost:3001/api/products/curl http://localhost:3001/api/user/profile \
-H "Authorization: Bearer YOUR_JWT_TOKEN_HERE"Expected Response:
{
"userId": 1,
"email": "john.doe@example.com",
"firstName": "John",
"lastName": "Doe",
"roles": ["ROLE_USER"]
}curl -X POST http://localhost:3001/api/payments/initiatePayment/123 \
-H "Authorization: Bearer YOUR_JWT_TOKEN_HERE"Expected Response:
https://checkout.stripe.com/c/pay/cs_test_...
Open this URL in your browser to complete test payment.
curl "http://localhost:3001/api/products/list?pageNumber=0&pageSize=5&sortBy=price&ascending=false"- Open browser:
http://localhost:3001/oauth2/authorization/google - Login with Google account
- Authorize the application
- You'll be redirected to success page with JWT token
First, create an admin user:
curl -X POST http://localhost:3001/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "admin@example.com",
"password": "AdminPassword123!",
"firstName": "Admin",
"lastName": "User",
"roles": ["USER", "ADMIN"]
}'Login as admin and get all users:
curl http://localhost:3001/api/user/list \
-H "Authorization: Bearer ADMIN_JWT_TOKEN_HERE"All services use environment variables for configuration:
| Variable | Service | Description | Example |
|---|---|---|---|
DATABASE_URL |
User Service | PostgreSQL connection string | jdbc:postgresql://localhost:5432/authserver |
DATABASE_USERNAME |
User Service | PostgreSQL username | postgres |
DATABASE_PASSWORD |
User Service | PostgreSQL password | root |
GOOGLE_CLIENT_ID |
User Service | Google OAuth2 client ID | 123456.apps.googleusercontent.com |
GOOGLE_CLIENT_SECRET |
User Service | Google OAuth2 client secret | GOCSPX-xxx |
KEYSTORE_PASSWORD |
User Service, Gateway | Keystore password | password |
DB_HOST |
Product Service | MySQL host | localhost |
DB_PORT |
Product Service | MySQL port | 3306 |
DB_USER |
Product Service | MySQL username | root |
DB_PASSWORD |
Product Service | MySQL password | password |
REDIS_HOST |
Product Service | Redis host | localhost |
STRIPE_KEY |
Payment Service | Stripe API key | sk_test_xxx |
SENDER_EMAIL |
Email Service | Gmail address | sender@gmail.com |
SENDER_PASSWORD |
Email Service | Gmail app password | abcd efgh ijkl mnop |
KAFKA_BOOTSTRAP_SERVERS |
Email Service | Kafka brokers | localhost:9092 |
Default ports (can be changed in application.properties):
# Infrastructure
Service Discovery: 8761
API Gateway: 3001
PostgreSQL: 5432
MySQL: 3306 (mapped to 3307 in Docker)
Redis: 6379
Kafka: 9092
Zookeeper: 2181
# Application Services
User Service: 8080
Product Service: 8081
Payment Service: 8082
Email Service: 8181PostgreSQL (User Service):
spring.datasource.url=jdbc:postgresql://localhost:5432/authserver
spring.datasource.username=postgres
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=validateMySQL (Product Service):
spring.datasource.url=jdbc:mysql://localhost:3306/productservice
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=updatespring.data.redis.host=localhost
spring.data.redis.port=6379
spring.cache.type=redisCache Keys:
- Products:
PRODUCTSSERVICE:product-list:all-products - Individual Product:
PRODUCTS:PRODUCT_{id} - Categories:
PRODUCTSSERVICE:category-list:all-categories - Individual Category:
CATEGORIES:CATEGORY_{id}
TTL: 1 hour (3600 seconds)
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=emailServiceTopics:
send-email- Email notification events
Problem: Docker containers fail to start
Solutions:
# Check Docker is running
docker --version
docker-compose --version
# Clean up and rebuild
docker-compose down -v
docker-compose up --build
# Check logs for specific service
docker-compose logs user-serviceProblem: Could not connect to database
Solutions:
# Verify database is healthy
docker-compose ps
# Check database logs
docker-compose logs postgres-user
docker-compose logs mysql
# Restart database services
docker-compose restart postgres-user mysqlProblem: 401 Unauthorized or Invalid token
Solutions:
- Ensure keystore.jks exists in both
user-serviceandapi-gateway - Verify keystore password matches in
.envfile - Check token hasn't expired (1 hour validity)
- Ensure token is sent with
Bearerprefix
# Regenerate keystore if needed
keytool -genkeypair -alias auth-server -keyalg RSA -keysize 2048 \
-keystore keystore.jks -storepass password -validity 3650Problem: Redirect URI mismatch
Solutions:
- Verify redirect URIs in Google Cloud Console match exactly:
http://localhost:8080/login/oauth2/code/google - Check
GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRETin.env - Ensure user-service is running on port 8080
Problem: Welcome email not received
Solutions:
- Verify Gmail App Password is correct (16 characters, no spaces)
- Check Kafka is running:
docker-compose logs kafka - Verify email-service logs:
docker-compose logs email-service - Ensure
SENDER_EMAILandSENDER_PASSWORDin.env
Problem: Payment link not generated
Solutions:
- Verify Stripe API key starts with
sk_test_ - Check Stripe dashboard for API errors
- Ensure payment-service is running:
docker-compose logs payment-service
Problem: Products always fetched from database
Solutions:
# Check Redis is running
docker-compose ps redis
# Connect to Redis CLI
docker exec -it my-product-service-redis redis-cli
# Check cached keys
KEYS *
# Clear cache if needed
FLUSHALLProblem: Services not registering with Eureka
Solutions:
- Access Eureka dashboard: http://localhost:8761
- Verify
eureka.client.serviceUrl.defaultZonein service configs - Check service-discovery logs:
docker-compose logs service-discovery - Wait 30-60 seconds for services to register
Problem: Port already in use
Solutions:
# Find process using port (e.g., 8080)
lsof -i :8080 # macOS/Linux
netstat -ano | findstr :8080 # Windows
# Kill process or change port in application.propertiesProblem: Compilation errors or dependency issues
Solutions:
# Clean Maven cache
mvn clean install -U
# Skip tests during build
mvn clean install -DskipTests
# Delete and recreate .m2 repository
rm -rf ~/.m2/repository
mvn clean install# All services
docker-compose logs -f
# Specific service
docker-compose logs -f user-service
# Last 100 lines
docker-compose logs --tail=100 product-service
# Since specific time
docker-compose logs --since 2024-01-01T10:00:00
---
## π Project Structure
ecommerce-microservices/ β βββ api-gateway/ # API Gateway Service β βββ src/main/ β β βββ java/ β β β βββ com/john/personal/api_gateway/ β β β βββ configuration/ β β β β βββ FilterConfig.java β β β β βββ GatewayConfig.java β β β βββ security/ β β β βββ AuthenticationPreFilter.java β β βββ resources/ β β βββ application.properties β β βββ keystore.jks β βββ Dockerfile β βββ pom.xml β βββ service-discovery/ # Eureka Server β βββ src/main/ β β βββ java/ β β β βββ org/john/personal/service_discovery/ β β β βββ ServiceDiscoveryApplication.java β β βββ resources/ β β βββ application.properties β βββ Dockerfile β βββ pom.xml β βββ user-service/ # User & Auth Service β βββ src/main/ β β βββ java/ β β β βββ org/john/personal/userservice/ β β β βββ config/ β β β β βββ JwtUserPrincipal.java β β β β βββ SecurityConfig.java β β β βββ controllers/ β β β β βββ AuthController.java β β β β βββ UserController.java β β β β βββ OAuth2Controller.java β β β βββ dtos/ β β β β βββ request/ β β β β β βββ LoginRequestDto.java β β β β β βββ RegisterRequestDto.java β β β β βββ response/ β β β β βββ UserResponseDTO.java β β β βββ models/ β β β β βββ UserEntity.java β β β β βββ Role.java β β β β βββ AuthProvider.java β β β β βββ UserAuthMethodEntity.java β β β βββ repositories/ β β β β βββ UserRepository.java β β β β βββ UserAuthMethodRepository.java β β β βββ security/ β β β β βββ JwtAuthenticationFilter.java β β β β βββ OAuth2AuthenticationSuccessHandler.java β β β βββ services/ β β β βββ UserServiceImpl.java β β β βββ CustomUserDetailsService.java β β β βββ JwtService.java β β βββ resources/ β β βββ application.properties β β βββ keystore.jks β β βββ db/migration/ β β βββ V1__initial_schema.sql β β βββ V2__add_user_roles_table.sql β β βββ V3__change_username_to_email.sql β β βββ V4__add_oauth2_fields.sql β β βββ V5__.sql β β βββ V6__password_set_null.sql β βββ Dockerfile β βββ pom.xml β βββ product-service/ # Product Catalog Service β βββ src/main/ β β βββ java/ β β β βββ org/john/personal/productservice/ β β β βββ configurations/ β β β β βββ ApplicationConfig.java β β β βββ controller/ β β β β βββ ProductController.java β β β β βββ CategoryController.java β β β βββ dto/ β β β β βββ ProductRequestDTO.java β β β β βββ ProductResponseDTO.java β β β β βββ CategoryRequestDTO.java β β β β βββ CategoryResponseDTO.java β β β βββ model/ β β β β βββ BaseModel.java β β β β βββ Product.java β β β β βββ Category.java β β β βββ repository/ β β β β βββ ProductRepo.java β β β β βββ CategoryRepo.java β β β βββ service/ β β β β βββ ProductService.java β β β β βββ ProductServiceImpl.java β β β β βββ CategoryService.java β β β β βββ CategoryServiceImpl.java β β β βββ mapper/ β β β βββ ProductMapper.java β β β βββ CategoryMapper.java β β βββ resources/ β β βββ application.properties β β βββ db/migration/ β β βββ V1__init.sql β βββ Dockerfile β βββ pom.xml β βββ payment-service/ # Payment Processing Service β βββ src/main/ β β βββ java/ β β β βββ org/john/personal/paymentservice/ β β β βββ controllers/ β β β β βββ PaymentController.java β β β βββ paymentgateways/ β β β β βββ PaymentGateway.java β β β β βββ StripePaymentGateway.java β β β β βββ RazorpayPaymentGateway.java β β β βββ services/ β β β βββ PaymentService.java β β βββ resources/ β β βββ application.properties β βββ Dockerfile β βββ pom.xml β βββ email-service/ # Email Notification Service β βββ src/main/ β β βββ java/ β β β βββ org/john/personal/email_service/ β β β βββ consumers/ β β β β βββ SendEmailEventConsumer.java β β β βββ dto/ β β β β βββ SendEmailDto.java β β β βββ utils/ β β β βββ EmailUtil.java β β βββ resources/ β β βββ application.properties β βββ Dockerfile β βββ pom.xml β βββ docker-compose.yml # Docker Compose Configuration βββ .env.example # Environment Variables Template βββ .gitignore # Git Ignore Rules βββ README.md # This File
We welcome contributions! Please follow these steps:
-
Fork the repository
-
Create a feature branch:
git checkout -b feature/amazing-feature
-
Commit your changes:
git commit -m 'Add amazing feature' -
Push to the branch:
git push origin feature/amazing-feature
-
Open a Pull Request
- Follow Java coding conventions
- Write unit tests for new features
- Update documentation
- Add Javadoc comments
- Keep code DRY (Don't Repeat Yourself)
Use conventional commits:
feat: add user profile picture upload
fix: resolve JWT token expiration issue
docs: update API endpoint documentation
refactor: improve product service caching logic
test: add integration tests for payment service
This project is licensed under the MIT License - see the LICENSE file for details.
- Spring Boot Team for amazing framework
- Netflix OSS for Eureka
- Stripe for payment processing
- All open-source contributors
Made with β€οΈ by John Manohar
β Star this repository if you find it helpful!