HireCraft is a Springboot powered domestic service marketplace which provides a platform connecting service providers (e.g.plumbers, painters) to employers.
Accomplishments
Built stateless JWT authentication (HS512) with Spring Security and a role-based access control (RBAC) system separating Client, Service Provider, and Admin roles.
Implemented registration flows capturing phone numbers, plus forgot-password/reset-password logic with email delivery.
Seeded roles, permissions, and a default admin user via Flyway migrations.
Developed separate ClientProfile and ServiceProviderProfile domain models with full CRUD (occupation, hourly rate, average rating, etc.).
Added profile picture upload/update with default profile pictures and CV/document upload, backed by Cloudinary.
Built service-provider discovery/filtering so clients can find artisans by skills and ratings.
Implemented a booking lifecycle state machine with status tracking (Pending, In Progress, Completed, etc.) and status-update endpoints.
Added automated booking notification emails and client-facing booking views.
Built a provider dashboard with analytics — accepted-jobs counts, review counts, client metrics, and monthly booking charts (ProviderDashboardMetricsResponse, BookingChart).
Integrated a dual payment-gateway system: Paystack (active) and Stripe (legacy), including payment initiation and verification.
Implemented escrow payments, split payments, provider subaccounts/onboarding, and webhook handling.
Added configurable platform fee (10% default), currency, and minimum-amount settings.
Built a review/rating system with creation, filtering, duplicate-submission checks, and per-provider average-rating and review-count calculation.
Implemented real-time chat over WebSocket/STOMP (WebSocketConfig, MessageWebSocketController, SimpMessagingTemplate).
Built a notification system (model, service, DTOs, REST retrieval) tied to booking and review events.
Configured PostgreSQL with Flyway migrations applied automatically on startup (schema creation, seeding, location data).
Set up CORS configuration to support the separate frontend client.