A complete full-stack candidate management system built with .NET 8 Web API backend and React TypeScript frontend.
- PostgreSQL Database with normalized schema for candidates, job applications, resumes, work experience, education, and skills
- RESTful APIs for candidate search with advanced filtering
- Excel Import functionality with EPPlus library
- Background Job Processing for handling large Excel imports
- Entity Framework Core for data access
- Swagger/OpenAPI documentation
- Health Checks and logging with Serilog
- Modern React 18 with TypeScript
- TanStack Query (React Query) for server state management
- Zustand for global state management
- Tailwind CSS for styling
- Vite for fast development and building
- Candidate Search Interface with advanced filtering
- Excel Upload functionality
- Responsive Design
candidates- Main candidate informationjob_applications- Application trackingresumes- File management and parsed contentwork_experience- Employment historyeducation- Academic backgroundskills- Master skills listcandidate_skills- Many-to-many relationship with proficiency levels
- .NET 8 SDK
- Node.js 18+
- PostgreSQL 14+
-
Clone and navigate to backend:
cd backend -
Configure database connection: Update
appsettings.jsonwith your PostgreSQL connection string:{ "ConnectionStrings": { "DefaultConnection": "Host=localhost;Port=5432;Database=recruitingdb;Username=postgres;Password=your_password;" } } -
Create database:
# Create database manually in PostgreSQL or run: psql -U postgres -c "CREATE DATABASE recruitingdb;" # Run the database schema script psql -U postgres -d recruitingdb -f Database/01_create_tables.sql
-
Install dependencies and run:
dotnet restore dotnet build dotnet run --urls="http://localhost:5000" -
Access Swagger UI: Open http://localhost:5000/swagger
-
Navigate to frontend:
cd frontend -
Install dependencies:
npm install
-
Start development server:
npm run dev
-
Access application: Open http://localhost:3000
POST /search- Search candidates with filtersGET /{id}- Get candidate detailsPOST /- Create new candidatePUT /{id}- Update candidateDELETE /{id}- Delete candidate
POST /upload- Upload and process Excel file immediatelyPOST /preview- Preview Excel data before importPOST /queue- Queue Excel file for background processingGET /job-status/{jobId}- Get background job statusPOST /import-by-path- Import by file path (for background jobs)
The system expects Excel files with the following columns:
- First Name
- Last Name
- Email (required)
- Phone
- Location
- Current Company
- Current Title
- Years of Experience
- Visa Status
- Salary Expectation
- Relocation (Yes/No)
- Work Type
- University
- Degree
- Field of Study
- Skills (comma-separated)
- Notes
Controllers/
├── CandidatesController.cs # Main candidate API endpoints
└── ExcelImportController.cs # Excel import endpoints
Services/
├── ExcelImportService.cs # Excel processing logic
└── ExcelProcessingBackgroundService.cs # Background job processor
Models/
├── Candidate.cs # Core entity models
├── JobApplication.cs
├── Resume.cs
├── WorkExperience.cs
├── Education.cs
├── Skill.cs
└── CandidateSkill.cs
DTOs/
├── CandidateDto.cs # API response DTOs
├── RelatedDto.cs
└── SearchDto.cs
Data/
└── RecruiterDbContext.cs # EF Core DbContext
src/
├── pages/
│ ├── Dashboard.tsx # Dashboard page
│ └── Candidates.tsx # Candidate management page
├── components/
│ └── common/ # Reusable components
├── hooks/
│ └── useAppStore.ts # Zustand store
├── services/
│ └── api.ts # API service layer
└── types/
└── employee.ts # TypeScript types
- Complete CRUD operations for candidates
- Advanced search with multiple filter criteria
- Excel import with error handling and validation
- Background job processing for large imports
- Normalized database design for data integrity
- Modern React patterns with hooks and context
- Type-safe development with TypeScript
- Responsive UI with Tailwind CSS
- PostgreSQL chosen for robust relational data support
- Entity Framework Core for type-safe database operations
- EPPlus for Excel processing (better .NET 8 support than NPOI)
- Background services for processing large files without blocking UI
- React Query for efficient server state management
- Zustand for simple global state management
- Add authentication/authorization
- Implement input validation and sanitization
- Add rate limiting
- Use HTTPS in production
- Add database indexes for search columns
- Implement pagination for large datasets
- Add caching for frequently accessed data
- Optimize Excel processing for large files
- Add application insights/telemetry
- Implement proper error tracking
- Add performance monitoring
- Set up database monitoring
cd backend
dotnet testcd frontend
npm test- Configure production connection strings
- Set up database migrations
- Deploy to cloud service (Azure, AWS, etc.)
- Configure environment variables
- Build production bundle:
npm run build - Deploy to static hosting (Vercel, Netlify, etc.)
- Configure API endpoints for production
This project is licensed under the MIT License.