Repository Integration Plan
Overview
Integrate the repository pattern across all services in the nemesis codebase. Currently, repositories exist but are unused (0% integration). Services make direct ORM calls which should be routed through repositories.
Current State
- Existing Repositories:
UserRepository,CompanyRepository,CompanyEmployeeRepository,EmployeeContractRepository,EmployeeDetailRepository,DocumentRepository,DocumentLinkRepository,DocumentTypeRepository - Current Usage: 0% - No service uses any repository
- Direct ORM calls: 60+ model queries across 9 services
Architecture
Views → Services → Repositories → Models (ORM)
Phase 1: Create Missing Repositories
1.1 Contractor Repository (repositories/contractor_repository.py)
python
# Models: ContractorContract, ContractorInvite, ContractorDetail, CompanyContractor
1.2 Holiday Repository (repositories/holiday_repository.py)
python
# Models: CompanyHoliday, CompanyFloatingHoliday, FixedHoliday, FloatingHoliday
1.3 Leave Repository (repositories/leave_repository.py)
python
# Models: CompanyLeaveType, EmployeeLeaveType, LeaveRequest, CompanyLeavePolicy
1.4 Expense Repository (repositories/expense_repository.py)
python
# Models: CompanyExpenseType, ExpenseRequest, CompanyExpensePolicy
1.5 EKYC Repository (repositories/ekyc_repository.py)
python
# Models: KYCVerificationDetail, FaceMatchDetail
1.6 Commons Repository (repositories/commons_repository.py)
python
# Models: BankAccount, EmergencyContact, Address, Organization
1.7 Employee Extended Repository (add to existing employee_repository.py)
python
# Add: EmployeeSalaryStructureRepository, EmployeeInviteRepository
1.8 Company Extended Repository (add to existing company_repository.py)
python
# Add: BonusPolicyRepository, ProbationAndNoticePeriodRepository,
# CompanyBGVPlanRepository, CompanyWelcomeKitPlanRepository,
# CompanyHealthInsurancePlanRepository, CompanySettingVisitRepository,
# CompanyEmployerRepository, OrganizationRepository
1.9 Signature Repository (repositories/signature_repository.py)
python
# Models: SignatureRequest
Phase 2: Update repositories/__init__.py
Export all repositories for easy imports:
python
from .base_repository import BaseRepository
from .user_repository import UserRepository
from .company_repository import (
CompanyRepository, CompanyEmployeeRepository, CompanyEmployerRepository,
BonusPolicyRepository, ...
)
from .employee_repository import (
EmployeeContractRepository, EmployeeDetailRepository,
EmployeeSalaryStructureRepository, EmployeeInviteRepository
)
# ... all other repositories
Phase 3: Integrate Repositories into Services
3.1 employee_service.py
Replace direct ORM with:
EmployeeContractRepositoryfor EmployeeContract queriesEmployeeDetailRepositoryfor EmployeeDetail queriesEmployeeSalaryStructureRepositoryfor salary structureEmployeeInviteRepositoryfor invitesBankAccountRepositoryfor bank detailsEmergencyContactRepositoryfor emergency contactsCompanyEmployeeRepositoryfor CompanyEmployee
Changes:
python
class EmployeeService(BaseService):
def __init__(self):
super().__init__()
self.contract_repo = EmployeeContractRepository()
self.detail_repo = EmployeeDetailRepository()
self.salary_repo = EmployeeSalaryStructureRepository()
self.invite_repo = EmployeeInviteRepository()
self.bank_repo = BankAccountRepository()
self.emergency_repo = EmergencyContactRepository()
self.company_employee_repo = CompanyEmployeeRepository()
3.2 company_service.py
Replace direct ORM with:
CompanyRepositoryCompanyEmployeeRepositoryCompanyEmployerRepositoryBonusPolicyRepositoryProbationAndNoticePeriodRepositoryCompanyHolidayRepositoryCompanyFloatingHolidayRepositoryCompanyBGVPlanRepositoryCompanyWelcomeKitPlanRepositoryCompanyHealthInsurancePlanRepository
3.3 contractor_service.py
Replace direct ORM with:
ContractorContractRepositoryContractorInviteRepositoryContractorDetailRepositoryCompanyContractorRepository
3.4 user_service.py
Replace direct ORM with:
UserRepositoryEmployeeContractRepositoryCompanyEmployeeRepositoryCompanyEmployerRepositoryContractorContractRepositoryCompanyContractorRepositoryDocumentRepositoryFaceMatchDetailRepository
3.5 holiday_service.py
Replace direct ORM with:
CompanyHolidayRepositoryCompanyFloatingHolidayRepositoryCompanyRepositoryCompanySettingVisitRepository
3.6 leave_service.py
Replace direct ORM with:
EmployeeLeaveTypeRepositoryCompanyLeaveTypeRepositoryCompanySettingVisitRepository
3.7 expense_service.py
Replace direct ORM with:
CompanyExpenseTypeRepository
3.8 document_service.py
Replace direct ORM with:
DocumentRepositoryDocumentLinkRepositoryEmployeeDetailRepository
3.9 ekyc_service.py
Replace direct ORM with:
KYCVerificationDetailRepositoryFaceMatchDetailRepositoryBankAccountRepositoryEmployeeDetailRepositoryDocumentRepositoryCompanyEmployeeRepository
Phase 4: Files to Create/Modify
New Files (6):
repositories/contractor_repository.pyrepositories/holiday_repository.pyrepositories/leave_repository.pyrepositories/expense_repository.pyrepositories/ekyc_repository.pyrepositories/commons_repository.pyrepositories/signature_repository.py
Modified Files (12):
repositories/__init__.py- Export all reposrepositories/employee_repository.py- Add salary/invite reposrepositories/company_repository.py- Add plan/policy reposservices/employee_service.py- Use repositoriesservices/company_service.py- Use repositoriesservices/contractor_service.py- Use repositoriesservices/user_service.py- Use repositoriesservices/holiday_service.py- Use repositoriesservices/leave_service.py- Use repositoriesservices/expense_service.py- Use repositoriesservices/document_service.py- Use repositoriesservices/ekyc_service.py- Use repositories
Phase 5: Implementation Order
- Create all new repository files (Phase 1) - No dependencies
- Update existing repository files - Add missing model repositories
- Update
repositories/__init__.py- Export everything - Update services one by one (easiest to hardest):
expense_service.py(1 model)holiday_service.py(4 models)leave_service.py(3 models)document_service.py(5 models)contractor_service.py(4 models)user_service.py(10 models)ekyc_service.py(6 models)employee_service.py(9 models)company_service.py(18 models) - Most complex
Verification
After implementation:
- Run existing tests:
python manage.py test - Manual API testing of key endpoints:
GET /api/v1/users/details/- User contextGET /api/v1/companies/<id>/employees/- Employee listGET /api/v1/companies/<id>/dashboard/team_info/- DashboardPOST /api/v1/companies/<id>/employee_contracts/- Create contract
- Check for import errors:
python manage.py check
Notes
- No API changes: URLs and response structures remain identical
- Backward compatible: Services still return same data types
- Transaction safety: Repositories use same transaction context as services
- Performance: Repositories include
select_relatedoptimizations inget_queryset()