Welcome to Servify, a comprehensive service marketplace platform that connects service providers with clients. Built with modern technologies, Servify enables users to discover, book, and manage services seamlessly.
- Features
- Tech Stack
- Project Structure
- Installation & Setup
- API Endpoints
- Environment Variables
- Docker Deployment
- Testing
- Contributing
- User Authentication: Register, login, and token-based authentication (JWT)
- User Roles: Client, Service Provider, and Admin roles with role-based access
- Service Management: Create, read, update, and delete services
- Service Categories: Organize services by categories
- Bookings System: Clients can book services from providers
- Reviews & Ratings: Rate and review completed services
- Responsive Frontend: Modern React-based user interface
- RESTful API: Comprehensive API for all operations
- Runtime: Node.js 20
- Framework: Express.js
- Database: PostgreSQL 15
- Authentication: JWT (JSON Web Tokens)
- Utilities: bcrypt (password hashing), dotenv, cors
- Framework: React (Vite)
- Build Tool: Vite
- Styling: CSS
- Containerization: Docker & Docker Compose
- CI/CD: GitHub Actions
Servify/
βββ client/ # React Frontend
β βββ src/
β β βββ components/ # Reusable components
β β βββ pages/ # Page components
β β βββ services/ # API services
β β βββ main.jsx
β βββ Dockerfile
β
βββ server/ # Express Backend
β βββ config/ # Database configuration
β βββ controllers/ # Request handlers
β βββ middlewares/ # Auth & role middleware
β βββ models/ # Database models
β βββ routes/ # API routes
β βββ migrations/ # Database migrations
β βββ index.js # Server entry point
β βββ migrate.js # Migration runner
β βββ Dockerfile
β
βββ SQLfiles/ # Database initialization scripts
β βββ 01_init.pgsql # Initial schema
β
βββ docker-compose.yml # Docker services orchestration
βββ .env # Environment variables
βββ README.md
- Node.js 20+
- Docker & Docker Compose
- Git
-
Clone the repository:
git clone <repository-url> cd Servify
-
Create environment file:
cp server/.env.example server/.env
-
Update environment variables (see Environment Variables section)
-
Start with Docker Compose:
docker compose up
-
Access the application:
- Frontend:
http://localhost:5173 - Backend API:
http://localhost:3000/api/v1 - Database:
localhost:5432
- Frontend:
http://localhost:3000/api/v1
POST /auth/register
Body: { "full_name", "email", "password", "phone_number" }
Response: { "message", "userId" }
POST /auth/login
Body: { "email", "password" }
Response: { "accessToken" }
POST /auth/refresh
Body: { "refreshToken" }
Response: { "accessToken", "refreshToken" }
GET /users/profile
Auth: Required (Bearer Token)
Response: User object
PATCH /users/promote
Auth: Required (Bearer Token)
Body: {}
Response: { "message", "user", "accessToken", "refreshToken" }
PATCH /users/:id/role
Auth: Required (Admin Role)
Body: { "user_type": "client|provider|admin" }
Response: { "message", "user" }
GET /users/
Auth: Required (Admin Role)
Response: Array of users
GET /services/
Response: Array of services
GET /services/:id
Response: Service object
POST /services/create
Body: { "provider_id", "category_id", "title", "description", "price", "service_type", "location" }
Response: Created service object
PUT /services/edit/:id
Body: { "title", "description", "price", "service_type", "location" }
Response: Updated service object
DELETE /services/:id
Response: Deleted service object
Create a .env file in the root directory:
# Database Configuration
DB_USERNAME=servify
DB_PASSWORD=servify_2347socia
DB_HOST=postgres
DB_PORT=5432
DB_NAME=servify
# Server Configuration
PORT=3000
NODE_ENV=development
# JWT Secrets
JWT_SECRET=your_jwt_secret_key_for_access_tokens_should_be_long_and_complex_2026
JWT_SECRET_REFRESH=your_jwt_refresh_secret_key_for_refresh_tokens_should_be_long_and_complex_2026docker compose builddocker compose updocker compose downdocker compose down -vdocker compose logs -f servify-backend
docker compose logs -f servify-frontend
docker compose logs -f servify-db-
Register a User:
- POST:
http://localhost:3000/api/v1/auth/register - Body:
{ "full_name": "John Doe", "email": "john@example.com", "password": "securePassword123", "phone_number": "1234567890" }
- POST:
-
Login:
- POST:
http://localhost:3000/api/v1/auth/login - Body:
{ "email": "john@example.com", "password": "securePassword123" } - Copy the
accessToken
- POST:
-
Get Profile (with token):
- GET:
http://localhost:3000/api/v1/users/profile - Header:
Authorization: Bearer <your_token>
- GET:
-
Create Service:
- POST:
http://localhost:3000/api/v1/services/create - Body: Service details
- POST:
id(UUID): Primary keyfull_name(VARCHAR): User's full nameemail(VARCHAR): Unique emailpassword_hash(TEXT): Hashed passworduser_type(VARCHAR): 'client' | 'provider' | 'admin'phone_number(VARCHAR): Contact numberis_verified(BOOLEAN): Email verification statuscreated_at,updated_at(TIMESTAMP)
id(UUID): Primary keyprovider_id(UUID): Reference to userscategory_id(INT): Service categorytitle,description(VARCHAR/TEXT)price(NUMERIC): Service costservice_type(VARCHAR): 'online' | 'onsite'location(VARCHAR): Service locationcreated_at,updated_at(TIMESTAMP)
id(UUID): Primary keyclient_id,provider_id(UUID): References to usersservice_id(UUID): Reference to servicesstatus(VARCHAR): 'pending' | 'confirmed' | 'completed' | 'cancelled'booking_date(TIMESTAMP): Scheduled date
id(UUID): Primary keyprovider_id,client_id(UUID): Referencesrating(INT): 1-5 scalecomment(TEXT): Review text
- Create a feature branch:
git checkout -b feature/your-feature - Commit changes:
git commit -m 'Add your feature' - Push to branch:
git push origin feature/your-feature - Submit a Pull Request
This project is licensed under the MIT License.
For issues and questions, please open an issue on GitHub or contact the development team.
Happy coding! π