A trimmed, sanitized version of the Jobnet.ng codebase to demonstrate architecture and coding style. This edition focuses on core flows for Seekers and Employers, with pluggable AI stubs for CV analysis, job recommendations, and cover letter generation.
Heads up: This is a showcase repo structure meant for GitHub. Replace stubs with your real code as needed and keep secrets out of version control.
Seekers
- Email login/register (OAuth stubs for Google/LinkedIn included)
- Profile setup: personal info, experience, education, languages, awards
- Upload CV → AI scoring (stub) + recommendations (stub)
- Job search & apply (cover letter assist — stub)
- Track applications by status
Employers
- Email login/register
- Business verification: upload docs (stub workflow)
- Post jobs (free; premium stubs optional)
- AI assists job description & summary (stub)
- View jobs and manage incoming applications (shortlist/reject)
- PHP 8.2 (procedural style, modular includes)
- MySQL 8.x (PDO)
- Minimal routing (front controller)
- Optional Docker (php-apache + mysql)
- Optional CI: PHP_CodeSniffer + PHPStan
- Create a MySQL database (e.g.,
jobnet_demo). - Copy
.env.example→.envand set DB creds. - Import schema & seeds:
mysql -u root -p jobnet_demo < sql/schema.sql mysql -u root -p jobnet_demo < sql/seed-demo.sql
- Run the PHP dev server:
php -S 127.0.0.1:8080 public/index.php
- Try endpoints (examples):
GET /api/healthPOST /api/auth/register(email/password JSON)POST /api/auth/loginGET /api/jobsPOST /api/jobs/applyGET /api/applications/mine
Import the Jobnet Showcase collection into Postman to exercise the basics quickly. The bundle covers:
- Health check
- Auth register/login (seeker)
- Job listing, creation, and apply flows
- Application history
- AI helpers for CV analysis, cover letters, and recommendations
Update the request URLs if your server runs on a different host or port.
Demo accounts (from seeds):
- Seeker:
seeker@example.com/password123 - Employer:
employer@example.com/password123
- Composer can't reach Packagist (proxy 403): See docs/troubleshooting/composer-proxy.md for steps to reset or configure proxy settings so
composer installcan fetch dependencies.
docker compose up --build -d
# App: http://localhost:8080
# MySQL: 127.0.0.1:3306 (user: root / pass: rootpass / db: jobnet_demo)If MySQL init runs before the app is ready, re-run the SQL imports once the DB is up.
Environment is read from .env:
APP_ENV=local
APP_DEBUG=1
APP_URL=http://127.0.0.1:8080
DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=jobnet_demo
DB_USER=root
DB_PASS=
MAIL_FROM=hello@example.com
AI_PROVIDER=mock
OPENAI_API_KEY=
OAUTH_GOOGLE_CLIENT_ID=
OAUTH_GOOGLE_CLIENT_SECRET=
OAUTH_LINKEDIN_CLIENT_ID=
OAUTH_LINKEDIN_CLIENT_SECRET=
STORAGE_PATH=storage.
├─ README.md
├─ LICENSE
├─ .gitignore
├─ .env.example
├─ public/
│ ├─ .htaccess
│ └─ index.php
├─ routes/
│ └─ web.php
├─ app/
│ ├─ bootstrap.php
│ ├─ config.sample.php
│ ├─ db.php
│ ├─ helpers.php
│ └─ services/
│ ├─ Auth.php
│ ├─ AIAdapter.php
│ └─ Recommendation.php
├─ sql/
│ ├─ schema.sql
│ └─ seed-demo.sql
├─ storage/ # ignored — for uploads, generated files
├─ .github/
│ └─ workflows/
│ └─ php.yml
├─ composer.json
├─ docker-compose.yml
├─ Dockerfile
└─ .docker/
└─ vhost.conf
- Never commit
.env, credentials, or API keys. - Sanitise user input, use prepared statements (PDO).
- Include CSRF/nonce checks in real forms (omitted in this showcase for brevity).
- For OAuth, plug a proper library and secure redirect URIs.
Francis Oyitoba
Portfolio · LinkedIn · GitHub
MIT for your original code. Third‑party licenses remain with their owners.