OpenCap Stack is a comprehensive MERN stack application designed to manage stakeholders, share classes, documents, activities, notifications, equity simulations, tax calculations, and financial reporting. The project follows a Test-Driven Development (TDD) approach to ensure code quality and reliability and is fully aligned with the Open Cap Table Alliance (OCTA) schema.
This project follows the Semantic Seed Venture Studio Coding Standards (SSCS) which emphasizes:
- Structured Backlog Management with proper story IDs (OCAE-XXX, OCDI-XXX format)
- Test-Driven Development (TDD) with Red-Green-Refactor cycle
- Consistent Branch Naming (
feature/OCAE-XXX
,bug/OCAE-XXX
,chore/OCAE-XXX
) - Daily Commits with proper prefixes (including "WIP:" for work in progress)
- Pull Request Process that maintains traceability to backlog items
For detailed workflow guidelines, see SSCS_Workflow_Guide.md.
Follow these steps to set up the project on your local machine:
- Node.js (v14 or higher)
- MongoDB
- Docker and Docker Compose (for containerized development)
- Git
git clone https://github.com/Open-Cap-Stack/opencap.git
cd opencap
npm install
Create a .env
file in the root directory and add the following:
MONGODB_URI=mongodb://mongo:27017/opencap
PORT=5000
Replace mongodb://mongo:27017/opencap
with your MongoDB connection string if it's different.
npm start
This command starts the server on http://localhost:5000.
For automatic restarts on code changes, use:
npm run dev
For a containerized development environment:
# Build and start all services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop all services
docker-compose down
docker-compose -f docker-compose.test.yml up --build
This will run all tests in a containerized environment, ensuring consistent test results across different development machines.
The project uses Jest for testing. To run the tests, use the following command:
npm test
This command runs all the test cases defined in the tests
directory.
We measure test coverage locally for development purposes only:
npm run test:coverage
Important Note: We do NOT integrate with Codecov or any other third-party coverage service. All coverage reporting should be performed locally and documented in pull requests when relevant.
Our continuous integration and deployment pipeline focuses on:
- Docker Hub: For container image storage and versioning
- Digital Ocean: For deployment and hosting
The following secrets are required for our CI/CD pipeline:
DOCKERHUB_USERNAME
DOCKERHUB_TOKEN
DIGITALOCEAN_ACCESS_TOKEN
We follow the deployment plan outlined in OpenCap_TestCoverage_DigitalOceanDeployment.md.
To maintain codebase integrity and avoid conflicts:
-
Verify Existing Docker Resources:
docker ps -a # Check existing containers docker volume ls # Check existing volumes
-
Check Existing Files and Directories:
ls -la [directory] # List directory contents find . -name "pattern" # Find files matching pattern
-
Review Configurations: Always check current configuration before making changes
-
Database Schema Changes: Analyze existing schemas before modifications
These practices prevent duplication, conflicts, and ensure proper integration with the existing codebase.
Here are the primary API endpoints for the project:
- POST /api/users: Create a new user
- GET /api/users: Get all users
- GET /api/users/:id: Get a user by ID
- PUT /api/users/:id: Update a user by ID
- DELETE /api/users/:id: Delete a user by ID
- POST /api/stakeholders: Create a new stakeholder
- GET /api/stakeholders: Get all stakeholders
- GET /api/stakeholders/:id: Get a stakeholder by ID
- PUT /api/stakeholders/:id: Update a stakeholder by ID
- DELETE /api/stakeholders/:id: Delete a stakeholder by ID
- POST /api/communications: Create a new communication
- GET /api/communications: Get all communications
- GET /api/communications/:id: Get a communication by ID
- PUT /api/communications/:id: Update a communication
- GET /api/communications/threads/:threadId: Get communications by thread ID
- POST /api/communications/threads: Create a new thread
- POST /api/spv: Create a new SPV
- GET /api/spv: Get all SPVs
- GET /api/spv/:id: Get an SPV by ID
- PUT /api/spv/:id: Update an SPV
- GET /api/spv/status/:statusId: Get SPVs by status
- POST /api/spv-assets: Create a new SPV asset
- GET /api/spv-assets: Get all SPV assets
- GET /api/spv-assets/:id: Get an SPV asset by ID
- PUT /api/spv-assets/:id: Update an SPV asset
- POST /api/spv-assets/:id/valuation: Add a valuation to an SPV asset
- POST /api/compliance-checks: Create a new compliance check
- GET /api/compliance-checks: Get all compliance checks
- GET /api/compliance-checks/:id: Get a compliance check by ID
- PUT /api/compliance-checks/:id: Update a compliance check
- POST /api/taxCalculations: Create a new tax calculation
- GET /api/taxCalculations: Get all tax calculations
- GET /api/taxCalculations/:id: Get a tax calculation by ID
- PUT /api/taxCalculations/:id: Update a tax calculation
- POST /api/share-classes: Create a new share class
- GET /api/share-classes: Get all share classes
- GET /api/share-classes/:id: Get a share class by ID
- PUT /api/share-classes/:id: Update a share class by ID
- DELETE /api/share-classes/:id: Delete a share class by ID
- POST /api/documents: Create a new document
- GET /api/documents: Get all documents
- GET /api/documents/:id: Get a document by ID
- PUT /api/documents/:id: Update a document by ID
- DELETE /api/documents/:id: Delete a document by ID
- POST /api/activities: Create a new activity
- GET /api/activities: Get all activities
- GET /api/activities/:id: Get an activity by ID
- PUT /api/activities/:id: Update an activity by ID
- DELETE /api/activities/:id: Delete an activity by ID
- POST /api/notifications: Create a new notification
- GET /api/notifications: Get all notifications
- GET /api/notifications/:id: Get a notification by ID
- PUT /api/notifications/:id: Update a notification by ID
- DELETE /api/notifications/:id: Delete a notification by ID
- POST /api/equity-simulations: Create a new equity simulation
- GET /api/equity-simulations: Get all equity simulations
- GET /api/equity-simulations/:id: Get an equity simulation by ID
- PUT /api/equity-simulations/:id: Update an equity simulation by ID
- DELETE /api/equity-simulations/:id: Delete an equity simulation by ID
- POST /api/tax-calculations: Create a new tax calculation
- GET /api/tax-calculations: Get all tax calculations
- GET /api/tax-calculations/:id: Get a tax calculation by ID
- PUT /api/tax-calculations/:id: Update a tax calculation by ID
- DELETE /api/tax-calculations/:id: Delete a tax calculation by ID
- POST /api/financial-reports: Create a new financial report
- GET /api/financial-reports: Get all financial reports
- GET /api/financial-reports/:id: Get a financial report by ID
- PUT /api/financial-reports/:id: Update a financial report by ID
- DELETE /api/financial-reports/:id: Delete a financial report by ID
The project structure is organized as follows:
opencap/
βββ controllers/ # Controllers for handling API requests
βββ models/ # Mongoose models
βββ routes/ # API routes
βββ __tests__/ # Test cases (unit, integration)
βββ docs/ # Project documentation
βββ dags/ # Airflow DAGs for data pipelines
βββ .env # Environment variables
βββ .github/ # GitHub workflows for CI/CD
βββ docker-compose.yml # Docker compose configuration
βββ .gitignore # Files to ignore in Git
βββ CODE_OF_CONDUCT.md # Contributor code of conduct
βββ package.json # Project metadata and dependencies
βββ README.md # Project documentation
Contributions are welcome! This project follows the Semantic Seed Venture Studio Coding Standards (SSCS) with a Test-Driven Development (TDD) approach. All contributions should adhere to these standards for consistent workflow and code quality.
This project adheres to a Code of Conduct. By participating, you are expected to uphold this code. Please read the CODE_OF_CONDUCT.md for details on our code of conduct.
-
Fork the repository:
git fork https://github.com/Open-Cap-Stack/opencap.git
-
Create a new branch following SSCS naming conventions:
git checkout -b feature/OCAE-XXX # For new features git checkout -b bug/OCAE-XXX # For bug fixes git checkout -b chore/OCAE-XXX # For maintenance tasks
-
Write tests first (Red Tests):
- Write tests that demonstrate the functionality is NOT already present.
- Make a WIP commit:
git add . git commit -m "WIP: OCAE-XXX: Red Tests for feature description"
-
Implement code to pass the tests (Green Tests):
- Write the minimum amount of code required to pass the tests.
- Make a WIP commit when tests pass:
git add . git commit -m "WIP: OCAE-XXX: Green Tests for feature description"
-
Refactor your code:
- Refactor to improve code quality without changing functionality.
- Re-run the tests and commit with a final message:
git add . git commit -m "OCAE-XXX: Implement feature description"
-
Push your branch and create a pull request:
git push origin feature/OCAE-XXX
- Create a PR on GitHub with the story ID in the title.
- Include story details in the description.
- Mark the story as "Finished" in Shortcut.
-
Daily Commits Required:
- Even for incomplete work, commit daily with "WIP:" prefix.
- This ensures visibility and allows for collaboration.
For more detailed guidelines, refer to our SSCS_Workflow_Guide.md.
Follow these steps to submit your code changes:
-
Create a new branch:
git checkout -b feature/{story-id} # For features git checkout -b bug/{story-id} # For bugs git checkout -b chore/{story-id} # For chores
-
Make your changes:
- Ensure your code follows the coding standards (see below).
-
Write failing tests:
- Write tests that demonstrate the functionality is NOT already present.
- Make a WIP commit:
git add . git commit -m "WIP: Red Tests."
-
Implement code to pass the tests:
- Make WIP commits as you go, and commit code when your tests are green:
git add . git commit -m "WIP: Green Tests."
-
Refactor your code:
- Refactor to improve code quality. Re-run the tests and commit:
git add . git commit -m "Refactor complete."
-
Submit a pull request:
git push origin feature/{story-id} # Push your branch
- Go to the repository on GitHub and create a pull request from your branch to the main branch.
-
Review process:
- Review outstanding pull requests, comment on, approve and merge open pull requests, or request changes on any PRs that need improvement.
Please follow these coding standards to maintain code quality and consistency:
-
Indentation: Use 4 spaces for indentation.
-
Naming Conventions:
- Variables and functions: camelCase
- Classes and components: PascalCase
- Constants: UPPERCASE_SNAKE_CASE
-
Comments:
- Use JSDoc style comments for functions and classes.
Provide meaningful comments for complex code segments and functions.
-
Document any public APIs and classes with clear explanations of their purpose and usage.
-
Remove or update outdated comments as code changes.
-
Code Structure:
- Organize code into modules and components.
- Keep functions small and focused on a single task.
-
Lint: Ensure your code passes ESLint checks:
npm run lint
-
Testing:
-
Write unit tests using BDD-style frameworks like Mocha or Jasmine.
-
Follow the Arrange, Act, and Assert (AAA) pattern:
it('should correctly add two positive numbers', () => { // Arrange const num1 = 5; const num2 = 7; // Act const result = add(num1, num2); // Assert expect(result).to.equal(12); });
-
Write integration tests to validate interactions between different parts of the application.
-
Write functional tests to validate the application's functionality.
-
This project is licensed under the MIT License. See the LICENSE file for details.