Lably is a specialized job board for the dental technology industry. It connects dental labs and clinics with pre-verified CAD/CAM specialists, dental technicians, and dental lab professionals.
For full system design, database decisions, API details, and architecture notes, see DESIGN.md.
| Landing Page | Job Seeker |
|---|---|
| Employer | Admin |
|---|---|
| Frontend | Backend | Database | File Storage | Auth | Testing | CI/CD | Deployment | |
|---|---|---|---|---|---|---|---|---|
Integration tests using Jest and Supertest against a real PostgreSQL database (Neon) to catch real-world issues that mocks would miss.
- Authentication — login success, wrong password, wrong email
- Pending Applications — file upload submission, missing resume validation
- Activation Flow — full end-to-end: submit application → admin approves → token validation → account activation → login
- Jobs — create, edit, delete, and view job listings
- Employer Profile — create and update employer profile
- Email Service — mocked to prevent real emails during CI
npm test- Node.js
- PostgreSQL
- Supabase account
- Brevo account
git clone https://github.com/MahmoudAlHaj4/Lably.git
cd Lablycd lably-backend
npm installCreate a .env file in the lably-backend directory and fill in the following:
DB_HOST=
DB_USER=
DB_PASSWORD=
DB_NAME=
PORT=
JWT_SECRET=
DATABASE_URL=
SUPABASE_URL=
SUPABASE_SERVICE_ROLE_KEY=
FRONTEND_URL=
BREVO_HOST=
BREVO_PORT=
BREVO_USER=
BREVO_PASS=
BREVO_SENDER=
BREVO_API_KEY=node server.jsAdmin accounts are created manually. To log in as an admin, use the following credentials:
| Field | Value |
|---|---|
| admin@lably.com | |
| Password | admin123 |
To create or update the admin account, run the following SQL:
INSERT INTO users (email, password_hash, role)
VALUES ('admin@example.com', '<bcrypt_hashed_password>', 'admin');Note: Never store plain-text passwords. Use bcrypt to hash the password before inserting.
To generate a bcrypt hash, run the following in Node.js:
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash('your_password', 10);
console.log(hash);