The LTI ATS (Applicant Tracking System) is a modern, full-stack recruitment management platform designed to streamline the entire hiring process. This system enables organizations to efficiently manage candidates, track applications, organize interviews, and make data-driven hiring decisions.
The LTI ATS addresses critical challenges in modern recruitment by providing:
- Centralized Candidate Management: Comprehensive candidate profiles with education, work experience, and document storage
- Structured Interview Processes: Customizable interview flows with multiple stages and evaluation criteria
- Application Tracking: End-to-end visibility of candidate progress through hiring pipelines
- Collaborative Decision Making: Multi-stakeholder interview coordination and evaluation tools
- Data-Driven Insights: Analytics and reporting for recruitment process optimization
The system follows Domain-Driven Design (DDD) principles with a clean, layered architecture:
┌─────────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ ┌─────────────────────┐ ┌─────────────────────────────┐│
│ │ React Frontend │ │ Express.js Controllers ││
│ │ (TypeScript) │ │ (REST API) ││
│ └─────────────────────┘ └─────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Application Layer │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Services & Use Cases ││
│ │ (candidateService, positionService, etc.) ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Domain Layer │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ Domain Models & Business Logic ││
│ │ (Candidate, Position, Application, Interview) ││
│ └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Infrastructure Layer │
│ ┌─────────────────────┐ ┌─────────────────────────────┐│
│ │ PostgreSQL │ │ Prisma ORM ││
│ │ (Database) │ │ (Data Access) ││
│ └─────────────────────┘ └─────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
- Node.js with TypeScript - Server-side runtime and type safety
- Express.js - Web framework for REST API
- Prisma ORM - Type-safe database client and migrations
- PostgreSQL - Primary database for data persistence
- Jest - Unit and integration testing framework
- Serverless Framework - Cloud deployment capabilities
- React 18 with TypeScript - Modern UI framework with type safety
- React Bootstrap - UI component library
- React Router DOM - Client-side routing
- React Beautiful DnD - Drag and drop functionality for Kanban boards
- React DatePicker - Date selection components
- Docker - Containerization for PostgreSQL database
- Cypress - End-to-end testing framework
- ESLint & Prettier - Code linting and formatting
AI4Devs-LTI/
├── 📁 backend/ # Backend application
│ ├── 📁 src/
│ │ ├── 📁 presentation/ # Controllers & Routes
│ │ │ ├── 📁 controllers/ # REST API controllers
│ │ │ └── 📁 __tests__/ # Controller tests
│ │ ├── 📁 application/ # Application services
│ │ │ ├── 📁 services/ # Business logic services
│ │ │ └── validator.ts # Input validation
│ │ ├── 📁 domain/ # Domain layer
│ │ │ ├── 📁 models/ # Domain entities
│ │ │ └── 📁 repositories/ # Repository interfaces
│ │ ├── 📁 infrastructure/ # Infrastructure layer
│ │ └── 📁 routes/ # API route definitions
│ ├── 📁 prisma/ # Database schema & migrations
│ │ ├── schema.prisma # Database schema definition
│ │ ├── 📁 migrations/ # Database migration files
│ │ └── seed.ts # Database seeding script
│ ├── package.json # Backend dependencies
│ ├── tsconfig.json # TypeScript configuration
│ └── jest.config.js # Jest testing configuration
│
├── 📁 frontend/ # React frontend application
│ ├── 📁 src/
│ │ ├── 📁 components/ # React components
│ │ ├── 📁 services/ # API service layers
│ │ ├── 📁 pages/ # Page components
│ │ └── App.js # Main application component
│ ├── 📁 cypress/ # E2E testing
│ │ └── 📁 e2e/ # Cypress test specs
│ ├── package.json # Frontend dependencies
│ └── tsconfig.json # TypeScript configuration
│
├── 📁 documentation/ # Project documentation
│ ├── DataModel.md # Data model and entity documentation
│ └── api-spec.yml # OpenAPI specification
│
├── 📁 memory-bank/ # Project context & documentation
│ ├── projectbrief.md # Project overview
│ ├── productContext.md # Business context
│ └── systemPatterns.md # Architecture patterns
│
├── docker-compose.yml # PostgreSQL containerization
├── package.json # Root project configuration
└── README.md # This file
Ensure you have the following installed:
- Node.js (v16 or higher)
- npm (v8 or higher)
- Docker and Docker Compose
- Git
git clone git@github.com:LIDR-academy/AI4Devs-LTI-extended.git
cd AI4Devs-LTI-extended
Create environment files for both backend and frontend:
Backend Environment (backend/.env
):
# Database Configuration
DB_HOST=localhost
DB_PORT=5432
DB_USER=LTIdbUser
DB_PASSWORD=D1ymf8wyQEGthFR1E9xhCq
DB_NAME=LTIdb
# Application Configuration
PORT=3000
NODE_ENV=development
# Prisma Database URL
DATABASE_URL="postgresql://LTIdbUser:D1ymf8wyQEGthFR1E9xhCq@localhost:5432/LTIdb"
Frontend Environment (frontend/.env
):
REACT_APP_API_URL=http://localhost:3000
Start the PostgreSQL database using Docker Compose:
# Start PostgreSQL container
docker-compose up -d
# Verify the database is running
docker-compose ps
The PostgreSQL database will be available at:
- Host:
localhost
- Port:
5432
- Database:
LTIdb
- Username:
LTIdbUser
- Password:
D1ymf8wyQEGthFR1E9xhCq
# Navigate to backend directory
cd backend
# Install dependencies
npm install
# Generate Prisma client
npm run prisma:generate
# Run database migrations
npx prisma migrate deploy
# (Optional) Seed the database with sample data
npx prisma db seed
# Start the development server
npm run dev
The backend API will be available at http://localhost:3000
# Navigate to frontend directory (from project root)
cd frontend
# Install dependencies
npm install
# Start the development server
npm start
The frontend application will be available at http://localhost:3001
# From the frontend directory
cd frontend
# Install Cypress (if not already installed)
npm install
# Open Cypress Test Runner (Interactive)
npm run cypress:open
# Or run tests headlessly
npm run cypress:run
cd backend
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage
cd frontend
# Run unit tests
npm test
# Run E2E tests with Cypress
npm run cypress:run
# Open Cypress Test Runner
npm run cypress:open
The system uses the following main entities:
- Candidates: Personal information, education, work experience
- Companies: Organizations posting positions
- Positions: Job openings with requirements and descriptions
- Applications: Candidate applications to specific positions
- Interview Flows: Configurable interview process stages
- Interviews: Individual interview sessions and results
For detailed schema information, entity relationships, and the complete data model documentation, see documentation/DataModel.md
.
The REST API follows OpenAPI 3.0 specification. Key endpoints include:
GET /candidates
- List candidates with filtering and paginationPOST /candidates
- Create new candidateGET /candidates/{id}
- Get candidate detailsGET /positions
- List available positionsPOST /positions
- Create new positionPUT /candidates/{id}
- Update candidate interview stage
Full API documentation is available in documentation/api-spec.yml
.
- Follow the established coding patterns and architecture
- Write tests for new features
- Update documentation for API changes
- Use TypeScript for type safety
- Follow the domain-driven design principles
This project is licensed under the ISC License.
For questions or support, please contact the LTI Development Team.