Skip to main content

Askamar Labor - Job Matching Platform

My first full-stack project: A comprehensive job matching platform connecting employers and brokers with skilled workers. Features multi-role authentication, automated job lifecycle management, and admin moderation. The UI might be rough around the edges, but the business logic is surprisingly sophisticated for a first project.

  • Full Stack Development
  • Database Design
  • Authentication System
  • File Management

Overview

Askamar Labor is a full-stack web application that connects employers and job brokers with skilled workers in the labor market. The platform streamlines the hiring process by allowing workers to showcase their profiles and resumes, while employers and brokers can post jobs, review applications, and rate workers. An admin panel provides oversight for content moderation and user verification.

A Note on This Project: This was my very first full-stack project. Looking back, the UI is honestly pretty rough—I was still learning design principles and user experience. But what I'm proud of is the business logic underneath. For a first project, I managed to implement some genuinely complex features: multi-role authentication, automated job expiration, cascading location systems, and a complete review moderation workflow. It taught me that solid architecture and logic matter more than polish when you're learning.

Key Features

For Workers (Employees)

  • Profile Management - Create detailed profiles with skills, experience, location, and salary expectations
  • Resume Upload - Upload and manage multiple resume documents
  • Job Search & Application - Browse jobs with advanced filtering and apply with real-time tracking
  • Reputation System - Receive ratings and reviews from employers

For Employers & Brokers

  • Job Posting - Create listings with detailed requirements (profession, experience, location, salary range)
  • Application Management - Review and manage job applications in one place
  • Bulk Resume Download - Download all applicant resumes as a single ZIP file
  • Worker Rating - Rate and review workers after collaboration
  • Broker Features - Brokers can additionally manage candidate profiles on behalf of workers

For Administrators

  • Job Approval Workflow - Approve or reject job postings before they go live
  • Profile Verification - Verify worker profiles for authenticity
  • Content Moderation - Moderate user reviews and ratings
  • Platform Management - Oversee all users and content across the platform

System-Level Features

  • Role-based authentication with four distinct user types (Employee, Employer, Broker, Admin)
  • Automated job expiration - Jobs automatically expire 30 days after approval
  • Advanced search and filtering by profession, location, city, experience, and job type
  • File management for profile images and document uploads
  • Pagination for handling large datasets efficiently

Architecture

High-Level Design

┌─────────────┐         ┌──────────────┐         ┌──────────────┐
│   Frontend  │ ◄─────► │   Backend    │ ◄─────► │   Database   │
│   (React)   │  REST   │  (Express)   │  ORM    │   (MySQL)    │
└─────────────┘   API   └──────────────┘         └──────────────┘
                              │
                              ▼
                        ┌──────────────┐
                        │  Node-cron   │
                        │  (Scheduler) │
                        └──────────────┘

Component Interaction

Frontend → Backend:

  • React SPA handles all UI/UX and user interactions
  • Axios manages API communication with JWT token authentication
  • React Router provides client-side navigation
  • Formik + Yup handle form validation before submission

Backend → Database:

  • Sequelize ORM provides object-relational mapping with MySQL
  • Models define relationships between Users, Jobs, Profiles, Applications, Reviews, etc.
  • Sequelize hooks automate business logic (e.g., setting job expiration dates)

Scheduled Tasks:

  • Node-cron runs every 12 hours to check and expire jobs older than 30 days
  • Automated cleanup ensures job listings stay current without manual intervention

Tech Stack

Frontend

  • Framework: React 18
  • Routing: React Router
  • Styling: Tailwind CSS + DaisyUI
  • HTTP Client: Axios
  • Forms: Formik + Yup validation
  • Animations: Framer Motion
  • Pagination: React Paginate

Backend

  • Runtime: Node.js
  • Framework: Express.js
  • Database: MySQL
  • ORM: Sequelize
  • Authentication: JWT (jsonwebtoken)
  • Password Hashing: bcrypt
  • File Upload: Multer
  • ZIP Generation: Archiver
  • Task Scheduling: Node-cron
  • Validation: Express-validator

Database Schema

  • Users - Authentication and role management
  • Profiles - Employee and Employer/Broker profiles
  • Jobs - Job listings with status tracking
  • Applications - Job applications linking workers to jobs
  • Reviews - Rating and review system
  • Resumes - Document storage for worker resumes
  • Cities & LocalAreas - Cascading location system
  • Professions & JobTypes - Categorization taxonomies

Data Flow

Complete User Journey

1. User Registration → Profile Creation

User signs up → System validates credentials → Creates User record 
→ Automatically creates corresponding Profile (Employee or Employer/Broker) 
→ Profile initialized with default values based on role

2. Job Posting → Admin Approval → Publication

Employer/Broker creates job → Status: "Pending" → Admin reviews 
→ Admin approves → Status: "Approved" → Posting date set automatically 
→ Expiration date calculated (30 days) → Job becomes visible to workers

3. Job Search → Application → Review

Worker searches jobs (filters by profession, location, experience) 
→ Applies to job → Application stored with status tracking 
→ Employer reviews applications → Downloads resumes (ZIP) 
→ Accepts/Rejects applicants → Updates application status

4. Rating System

Employer/Broker rates worker → Review status: "Pending" 
→ Admin moderates → Approves/Rejects review 
→ Approved ratings appear on worker profile

5. Automated Expiration

Cron job runs every 12 hours → Queries jobs with status "Approved" 
→ Checks if posting date + 30 days < current date 
→ Updates expired jobs to status "Expired" → Removes from search results

Notable Implementations

1. Multi-Role Authentication System

Implemented JWT-based authentication with four distinct user types (Employee, Employer, Broker, Admin). Each role has specific route protection, dashboard views, and permissions. Middleware validates tokens and checks role-based access on every protected endpoint.

2. Cascading Location System

Designed a hierarchical location structure where Cities contain multiple LocalAreas. This enables granular geographic filtering—workers can specify their exact neighborhood, and employers can search by city or drill down to specific areas.

3. Bulk Resume Download

Employers can download all resumes from a candidate as a single ZIP file. The system includes authorization checks ensuring only employers who received applications can access resumes. Uses Archiver library to dynamically generate ZIP files on-demand.

4. Automated Job Lifecycle Management

Sequelize hooks automatically set job posting dates and expiration dates when admin changes status to "Approved". Node-cron scheduler runs every 12 hours to expire jobs older than 30 days, keeping listings current without manual intervention.

5. Review Moderation System

Three-state review system (Pending/Accepted/Rejected) with admin oversight prevents spam and inappropriate content. Reviews only appear on worker profiles after admin approval, maintaining platform quality.

6. Dynamic Profile Creation

User profiles are automatically initialized with default values upon registration based on user type. Employees get worker profiles with skill fields, while Employers/Brokers get company profiles with hiring fields.

7. Advanced Filtering System

Multi-criteria search across professions, locations, cities, experience levels, and job types. Frontend sends filter parameters as query strings, backend builds dynamic Sequelize queries with WHERE clauses, returning paginated results.

8. File Upload Management

Multer middleware handles profile images and resume documents with file type validation and size limits. Files are stored on the server with unique filenames to prevent collisions. Resume deletion includes cleanup of physical files.

Use Case

Target Users

Workers seeking jobs matching their skills and location preferences in sectors like:

  • Construction and skilled trades
  • Hospitality and service industry
  • Domestic services
  • Manual labor and logistics

Employers needing to hire skilled labor quickly with verified profiles and resume access

Job Brokers managing multiple candidates and connecting them with opportunities, acting as intermediaries

Platform Administrators ensuring quality control, preventing fraud, and moderating content

Real-World Application

Scenario: A construction company needs 5 skilled carpenters in Addis Ababa for a 3-month project.

Workflow:

  1. Employer posts job with requirements (profession: Carpenter, experience: 3+ years, location: Addis Ababa, salary range)
  2. Admin reviews and approves the job posting
  3. Workers search for carpenter jobs in their area, filter by experience and salary
  4. Multiple workers apply with their profiles and resumes
  5. Employer reviews applications, downloads all resumes as ZIP, shortlists candidates
  6. Employer accepts 5 applicants, rejects others (status updates notify workers)
  7. After project completion, employer rates workers, reviews go to admin for moderation
  8. Job automatically expires 30 days after posting, keeping the platform current

Benefits

  • For Workers: Centralized job search, profile showcase, reputation building through ratings
  • For Employers: Quick access to verified candidates, bulk resume downloads, quality filtering
  • For Brokers: Manage multiple candidates efficiently, connect workers with opportunities
  • For Platform: Automated moderation, quality control, fraud prevention

Reflections on My First Project

This was my first serious attempt at building a full-stack application from scratch. Here's what I learned:

What Went Well:

  • The business logic is genuinely complex for a first project—multi-role auth, automated workflows, file management, and moderation systems all working together
  • Database design with proper relationships and cascading deletes
  • Sequelize hooks for automating business logic were a game-changer
  • JWT authentication and role-based access control implemented correctly
  • Automated job expiration with cron jobs shows understanding of background tasks

What I'd Do Differently:

  • The UI is rough. I was focused on making things work, not making them beautiful. I've learned a lot about design since then.
  • No TypeScript—I'd definitely use it now for better type safety
  • File uploads could use cloud storage (S3) instead of local filesystem
  • Could benefit from better error handling and user feedback
  • Testing was minimal—I'd write comprehensive tests now
  • API could be more RESTful in some places

Key Takeaway: This project taught me that solid architecture and business logic matter more than visual polish when you're learning. Yes, the UI could be better, but the fact that I built a working multi-role platform with automated workflows, file management, and admin moderation on my first try? That's something I'm proud of. It gave me the confidence to tackle more complex projects and taught me the fundamentals that I still use today.


Conclusion

Askamar Labor demonstrates foundational full-stack development skills: REST API design, database relationships, authentication flows, file handling, and role-based access control. While the UI shows my inexperience at the time, the business logic reveals a strong grasp of complex system design. It's a testament to learning by building—imperfect, but functional and surprisingly sophisticated for a first project.