7.7 KiB
7.7 KiB
MerchantsOfHope.org - Architecture Documentation
Overview
MerchantsOfHope.org is a multi-tenant recruiting platform built with Hack/PHP, designed to serve multiple lines of business within TSYS Group while maintaining complete isolation between tenants.
System Architecture
High-Level Architecture
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Load Balancer │────│ Nginx │────│ Application │
└─────────────────┘ │ (Reverse Proxy)│ │ (PHP/Hack) │
└─────────────────┘ └─────────────────┘
│
┌─────────────────┐ ┌─────────────────┐ ┌──────▼──────────┐
│ Frontend │ │ Caching │ │ PostgreSQL │
│ (React/Vue) │ │ (Redis) │ │ Database │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│
┌─────────────▼──────────┐
│ Mail Service │
│ (SMTP/MailHog) │
└────────────────────────┘
Service Architecture
- Application Service: Main PHP/Hack application serving business logic
- Database Service: PostgreSQL for primary data storage
- Cache Service: Redis for session storage and caching
- Mail Service: SMTP service for email communications
- OAuth Services: External providers for authentication (Google, GitHub)
Multi-Tenancy Implementation
Tenant Isolation Strategy
- Data Isolation: Each tenant's data is isolated using a
tenant_idcolumn in all relevant tables - Request Context: Tenant context is determined via subdomain (tenant.merchantsofhope.org) or path (merchantsofhope.org/tenant)
- Database Queries: All data access queries include tenant_id filters to prevent cross-tenant data access
Tenant Resolution Flow
- Request comes in with hostname or path
- TenantMiddleware extracts tenant identifier
- TenantResolverService looks up tenant information
- Tenant information attached to request context
- All subsequent operations validate tenant access
Security & Compliance
Authentication & Authorization
- OIDC Integration: Support for OpenID Connect providers
- Social Login: Google and GitHub OAuth integration
- JWT Tokens: Stateful authentication using JWT tokens
- Role-Based Access Control: Different permissions for job seekers vs job providers
Compliance Frameworks Implemented
1. USA Employment Law Compliance
- Anti-Discrimination: Validation to prevent discriminatory language in job postings
- Data Retention: Automatic anonymization of personal data after required periods
- Audit Logging: Complete audit trail for all data access
2. Accessibility (Section 508/WCAG 2.1 AA)
- Semantic HTML: Proper heading hierarchy and structure
- Alt Text: Required for all images
- Form Labels: Associated with input elements
- Color Contrast: Sufficient contrast ratios
3. PCI DSS Compliance
- No Sensitive Data Storage: PAN, CVV, and track data are never stored
- Proper Masking: When PAN is displayed, it's properly masked (first 6, last 4)
- Audit Logs: Logging of all access to payment-related data
4. GDPR Compliance
- Data Subject Rights: APIs to handle access, rectification, erasure, portability, and restriction requests
- Consent Management: Explicit consent for data processing
- Data Minimization: Only necessary data is collected
5. SOC 2 Compliance
- Access Controls: Proper authentication and authorization for all operations
- Audit Logging: Complete audit trail of all system access
- Change Management: Proper procedures for system changes
6. FedRAMP Compliance
- Security Controls: Implementation of required security controls based on data classification
- Continuous Monitoring: Ongoing assessment of security posture
- Incident Response: Defined procedures for security incidents
Application Components
Models
User: Represents users (job seekers or job providers)Job: Represents job postingsApplication: Represents job applicationsTenant: Represents individual tenants
Services
TenantResolverService: Resolves tenant from request contextJobService: Handles job-related operations with tenant isolationApplicationService: Manages job applicationsAuthService: Handles authentication and OAuth flowsComplianceService: Ensures compliance with various regulationsAccessibilityService: Validates and generates accessible contentSecurityComplianceService: Handles security compliance requirements
Controllers
HomeController: Basic home pageAuthController: Authentication endpointsJobController: Job-related endpointsApplicationController: Application-related endpoints
Middleware
TenantMiddleware: Ensures tenant isolation for each request
API Design
RESTful Endpoints
- Consistent naming conventions
- Proper HTTP methods (GET, POST, PUT, DELETE)
- Standard response formats
- Proper status codes
Error Handling
- Consistent error response format
- Appropriate HTTP status codes
- Detailed error messages (only in development)
Database Design
Key Tables
tenants: Tenant isolation informationusers: User accounts with tenant_idjobs: Job postings with tenant_idapplications: Job applications with tenant_idaudit_logs: Compliance audit logs
Indexing Strategy
- Indexes on tenant_id for all tenant-isolated tables
- Indexes on frequently queried fields
- Proper foreign key constraints
Deployment Architecture
Kubernetes Configuration
The application is designed for Kubernetes deployment with:
- Deployments: For application and service scaling
- Services: For internal and external networking
- ConfigMaps: For configuration management
- Secrets: For sensitive data like API keys
- PersistentVolumes: For data persistence
- Ingress: For external access and load balancing
Environment Configuration
- Separate configurations for development, staging, and production
- Environment-specific variable management
- Database migration strategy
- Backup and recovery procedures
Security Considerations
Input Validation
- Server-side validation for all inputs
- Sanitization of user-generated content
- Prevention of SQL injection and XSS attacks
Data Protection
- Encryption at rest for sensitive data
- Encryption in transit using HTTPS
- Proper session management
- Secure password handling
Monitoring & Logging
- Comprehensive audit logging
- Performance monitoring
- Security event monitoring
- Log aggregation and analysis
Performance Considerations
Caching Strategy
- Redis for session storage
- Redis for application-level caching
- Database query optimization
- Response caching where appropriate
Scalability
- Stateless application design
- Horizontal pod scaling in Kubernetes
- Database read replicas for read-heavy operations
- CDN for static assets