Update README.md to provide a comprehensive overview of The Order monorepo, including repository structure, quickstart guide, development workflow, and contribution guidelines.
This commit is contained in:
31
.editorconfig
Normal file
31
.editorconfig
Normal file
@@ -0,0 +1,31 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
# Matches multiple files with brace expansion notation
|
||||
[*.{js,jsx,ts,tsx,json,yml,yaml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
[*.{py,go}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[Makefile]
|
||||
indent_style = tab
|
||||
|
||||
[*.sh]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
19
.eslintrc.js
Normal file
19
.eslintrc.js
Normal file
@@ -0,0 +1,19 @@
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: ['eslint:recommended'],
|
||||
parser: '@typescript-eslint/parser',
|
||||
plugins: ['@typescript-eslint'],
|
||||
env: {
|
||||
node: true,
|
||||
es2022: true,
|
||||
},
|
||||
parserOptions: {
|
||||
ecmaVersion: 2022,
|
||||
sourceType: 'module',
|
||||
},
|
||||
rules: {
|
||||
// Add custom rules here
|
||||
},
|
||||
ignorePatterns: ['node_modules', 'dist', 'build', '.next', 'coverage'],
|
||||
};
|
||||
|
||||
29
.gitattributes
vendored
Normal file
29
.gitattributes
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Force LF line endings for specific file types
|
||||
*.sh text eol=lf
|
||||
*.yaml text eol=lf
|
||||
*.yml text eol=lf
|
||||
*.json text eol=lf
|
||||
*.md text eol=lf
|
||||
*.ts text eol=lf
|
||||
*.tsx text eol=lf
|
||||
*.js text eol=lf
|
||||
*.jsx text eol=lf
|
||||
*.py text eol=lf
|
||||
*.go text eol=lf
|
||||
|
||||
# Denote all files that are truly binary
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.jpeg binary
|
||||
*.gif binary
|
||||
*.ico binary
|
||||
*.svg binary
|
||||
*.woff binary
|
||||
*.woff2 binary
|
||||
*.ttf binary
|
||||
*.eot binary
|
||||
*.pdf binary
|
||||
|
||||
48
.github/CODEOWNERS
vendored
Normal file
48
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
# Global owners
|
||||
* @the-order/core-team
|
||||
|
||||
# Apps
|
||||
/apps/portal-public/ @the-order/frontend-team
|
||||
/apps/portal-internal/ @the-order/frontend-team @the-order/admin-team
|
||||
/apps/mcp-members/ @the-order/mcp-team
|
||||
/apps/mcp-legal/ @the-order/mcp-team @the-order/legal-team
|
||||
|
||||
# Services
|
||||
/services/intake/ @the-order/backend-team
|
||||
/services/identity/ @the-order/identity-team @the-order/security-team
|
||||
/services/finance/ @the-order/finance-team @the-order/backend-team
|
||||
/services/dataroom/ @the-order/backend-team @the-order/security-team
|
||||
/services/omnis-brand/ @the-order/omnis-team
|
||||
/services/arromis-brand/ @the-order/arromis-team
|
||||
|
||||
# Packages
|
||||
/packages/ui/ @the-order/frontend-team
|
||||
/packages/schemas/ @the-order/backend-team @the-order/frontend-team
|
||||
/packages/auth/ @the-order/identity-team @the-order/security-team
|
||||
/packages/storage/ @the-order/backend-team
|
||||
/packages/crypto/ @the-order/security-team @the-order/identity-team
|
||||
/packages/workflows/ @the-order/backend-team
|
||||
/packages/test-utils/ @the-order/backend-team
|
||||
|
||||
# Infrastructure
|
||||
/infra/ @the-order/devops-team @the-order/security-team
|
||||
/infra/terraform/ @the-order/devops-team
|
||||
/infra/k8s/ @the-order/devops-team
|
||||
/infra/gateways/ @the-order/devops-team @the-order/security-team
|
||||
|
||||
# Documentation
|
||||
/docs/ @the-order/core-team
|
||||
/docs/governance/ @the-order/core-team @the-order/security-team
|
||||
/docs/architecture/ @the-order/architecture-team
|
||||
/docs/legal/ @the-order/legal-team
|
||||
|
||||
# CI/CD
|
||||
/.github/workflows/ @the-order/devops-team
|
||||
/.github/CODEOWNERS @the-order/core-team
|
||||
|
||||
# Root config files
|
||||
/package.json @the-order/core-team
|
||||
/pnpm-workspace.yaml @the-order/core-team
|
||||
/turbo.json @the-order/core-team
|
||||
/tsconfig*.json @the-order/core-team
|
||||
|
||||
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
---
|
||||
name: Bug Report
|
||||
about: Create a report to help us improve
|
||||
title: '[BUG] '
|
||||
labels: bug
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## Description
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
## Steps to Reproduce
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
## Expected Behavior
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
## Actual Behavior
|
||||
A clear and concise description of what actually happened.
|
||||
|
||||
## Environment
|
||||
- OS: [e.g. Ubuntu 22.04]
|
||||
- Node.js version: [e.g. 18.17.0]
|
||||
- pnpm version: [e.g. 8.15.0]
|
||||
- Browser (if applicable): [e.g. Chrome 120]
|
||||
|
||||
## Screenshots
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
## Additional Context
|
||||
Add any other context about the problem here.
|
||||
|
||||
## Possible Solution
|
||||
If you have suggestions on how to fix the bug, please describe them here.
|
||||
|
||||
29
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
29
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: '[FEATURE] '
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## Description
|
||||
A clear and concise description of what the feature is.
|
||||
|
||||
## Problem Statement
|
||||
What problem does this feature solve? What is the use case?
|
||||
|
||||
## Proposed Solution
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
## Alternatives Considered
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
## Additional Context
|
||||
Add any other context, mockups, or screenshots about the feature request here.
|
||||
|
||||
## Implementation Notes
|
||||
If you have ideas on how this could be implemented, please share them here.
|
||||
|
||||
## Related Issues
|
||||
Link to any related issues or discussions.
|
||||
|
||||
38
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
38
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
## Description
|
||||
Brief description of changes
|
||||
|
||||
## Type of Change
|
||||
- [ ] Bug fix
|
||||
- [ ] New feature
|
||||
- [ ] Breaking change
|
||||
- [ ] Documentation update
|
||||
- [ ] Performance improvement
|
||||
- [ ] Refactoring
|
||||
|
||||
## Related Issues
|
||||
Closes #(issue number)
|
||||
|
||||
## Testing
|
||||
How was this tested?
|
||||
|
||||
- [ ] Unit tests added/updated
|
||||
- [ ] Integration tests added/updated
|
||||
- [ ] Manual testing performed
|
||||
|
||||
## Checklist
|
||||
- [ ] Code follows style guidelines
|
||||
- [ ] Self-review completed
|
||||
- [ ] Comments added for complex code
|
||||
- [ ] Documentation updated
|
||||
- [ ] Tests added/updated
|
||||
- [ ] All tests pass
|
||||
- [ ] No new warnings
|
||||
- [ ] Type checking passes
|
||||
- [ ] Linting passes
|
||||
|
||||
## Screenshots (if applicable)
|
||||
<!-- Add screenshots here -->
|
||||
|
||||
## Additional Notes
|
||||
<!-- Any additional information -->
|
||||
|
||||
235
.github/workflows/ci.yml
vendored
Normal file
235
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,235 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, develop]
|
||||
pull_request:
|
||||
branches: [main, develop]
|
||||
|
||||
env:
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
|
||||
|
||||
jobs:
|
||||
lint-and-typecheck:
|
||||
name: Lint and Type Check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Lint
|
||||
run: pnpm lint
|
||||
|
||||
- name: Type check
|
||||
run: pnpm type-check
|
||||
|
||||
test:
|
||||
name: Test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Run tests
|
||||
run: pnpm test
|
||||
|
||||
- name: Upload coverage
|
||||
uses: codecov/codecov-action@v3
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
files: ./coverage/lcov.info
|
||||
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
|
||||
security-scan:
|
||||
name: Security Scan
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Run Trivy vulnerability scanner
|
||||
uses: aquasecurity/trivy-action@master
|
||||
with:
|
||||
scan-type: 'fs'
|
||||
scan-ref: '.'
|
||||
format: 'sarif'
|
||||
output: 'trivy-results.sarif'
|
||||
|
||||
- name: Upload Trivy results to GitHub Security
|
||||
uses: github/codeql-action/upload-sarif@v2
|
||||
with:
|
||||
sarif_file: 'trivy-results.sarif'
|
||||
|
||||
sbom:
|
||||
name: Generate SBOM
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Install Syft
|
||||
uses: anchore/sbom-action/download-syft@v0
|
||||
with:
|
||||
syft-version: latest
|
||||
|
||||
- name: Generate SBOM
|
||||
run: |
|
||||
syft packages dir:. -o spdx-json > sbom.spdx.json
|
||||
syft packages dir:. -o cyclonedx-json > sbom.cyclonedx.json
|
||||
|
||||
- name: Upload SBOM artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: sbom
|
||||
path: |
|
||||
sbom.spdx.json
|
||||
sbom.cyclonedx.json
|
||||
|
||||
- name: Run Grype scan
|
||||
uses: anchore/scan-action@v3
|
||||
id: grype
|
||||
with:
|
||||
path: "."
|
||||
fail-build: false
|
||||
severity-cutoff: high
|
||||
|
||||
- name: Upload Grype results
|
||||
uses: github/codeql-action/upload-sarif@v2
|
||||
if: always()
|
||||
with:
|
||||
sarif_file: ${{ steps.grype.outputs.sarif }}
|
||||
|
||||
docker-build:
|
||||
name: Build Docker Images
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||
needs: [build]
|
||||
strategy:
|
||||
matrix:
|
||||
service:
|
||||
- intake
|
||||
- identity
|
||||
- finance
|
||||
- dataroom
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Log in to Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ghcr.io/${{ github.repository }}/${{ matrix.service }}
|
||||
tags: |
|
||||
type=ref,event=branch
|
||||
type=ref,event=pr
|
||||
type=semver,pattern={{version}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=sha
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: ./services/${{ matrix.service }}
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Sign image with Cosign
|
||||
uses: sigstore/cosign-installer@v3
|
||||
if: github.ref == 'refs/heads/main'
|
||||
|
||||
- name: Sign container image
|
||||
run: |
|
||||
cosign sign --yes ${{ steps.meta.outputs.tags }}
|
||||
|
||||
71
.github/workflows/release.yml
vendored
Normal file
71
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
env:
|
||||
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
|
||||
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Release
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
cache: 'pnpm'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
|
||||
- name: Run tests
|
||||
run: pnpm test
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: Release ${{ github.ref }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
- name: Deploy to Staging
|
||||
run: |
|
||||
echo "Deploy to staging environment"
|
||||
# Add deployment steps here
|
||||
|
||||
- name: Wait for approval
|
||||
uses: trstringer/manual-approval@v1
|
||||
with:
|
||||
secret: ${{ github.TOKEN }}
|
||||
approvers: the-order/release-team
|
||||
minimum-approvals: 1
|
||||
|
||||
- name: Deploy to Production
|
||||
if: success()
|
||||
run: |
|
||||
echo "Deploy to production environment"
|
||||
# Add deployment steps here
|
||||
|
||||
79
.gitignore
vendored
Normal file
79
.gitignore
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
.pnp
|
||||
.pnp.js
|
||||
|
||||
# Testing
|
||||
coverage/
|
||||
*.lcov
|
||||
.nyc_output
|
||||
|
||||
# Production
|
||||
build/
|
||||
dist/
|
||||
.next/
|
||||
out/
|
||||
*.tsbuildinfo
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
.env*.local
|
||||
.env.enc
|
||||
*.env.enc
|
||||
!.env.example
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.idea/
|
||||
.vscode/
|
||||
*.sublime-project
|
||||
*.sublime-workspace
|
||||
|
||||
# Turbo
|
||||
.turbo/
|
||||
|
||||
# TypeScript
|
||||
*.tsbuildinfo
|
||||
|
||||
# Terraform
|
||||
*.tfstate
|
||||
*.tfstate.*
|
||||
.terraform/
|
||||
.terraform.lock.hcl
|
||||
|
||||
# Kubernetes
|
||||
*.kubeconfig
|
||||
|
||||
# Secrets
|
||||
secrets/
|
||||
*.key
|
||||
*.pem
|
||||
*.crt
|
||||
!*.example.key
|
||||
!*.example.pem
|
||||
!*.example.crt
|
||||
|
||||
# SOPS
|
||||
.sops.yaml
|
||||
|
||||
# Temporary files
|
||||
tmp/
|
||||
temp/
|
||||
*.tmp
|
||||
|
||||
# Submodules (optional - uncomment if you want to track submodule changes)
|
||||
# .git/modules/
|
||||
|
||||
43
.gitmodules
vendored
Normal file
43
.gitmodules
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
# Git submodules configuration for The Order monorepo
|
||||
# Uncomment and update URLs when ready to add submodules
|
||||
#
|
||||
# [submodule "apps/portal-public"]
|
||||
# path = apps/portal-public
|
||||
# url = https://github.com/the-order/portal-public.git
|
||||
#
|
||||
# [submodule "apps/portal-internal"]
|
||||
# path = apps/portal-internal
|
||||
# url = https://github.com/the-order/portal-internal.git
|
||||
#
|
||||
# [submodule "apps/mcp-members"]
|
||||
# path = apps/mcp-members
|
||||
# url = https://github.com/the-order/mcp-members.git
|
||||
#
|
||||
# [submodule "apps/mcp-legal"]
|
||||
# path = apps/mcp-legal
|
||||
# url = https://github.com/the-order/mcp-legal.git
|
||||
#
|
||||
# [submodule "services/intake"]
|
||||
# path = services/intake
|
||||
# url = https://github.com/the-order/intake.git
|
||||
#
|
||||
# [submodule "services/identity"]
|
||||
# path = services/identity
|
||||
# url = https://github.com/the-order/identity.git
|
||||
#
|
||||
# [submodule "services/finance"]
|
||||
# path = services/finance
|
||||
# url = https://github.com/the-order/finance.git
|
||||
#
|
||||
# [submodule "services/dataroom"]
|
||||
# path = services/dataroom
|
||||
# url = https://github.com/the-order/dataroom.git
|
||||
#
|
||||
# [submodule "services/omnis-brand"]
|
||||
# path = services/omnis-brand
|
||||
# url = https://github.com/the-order/omnis-brand.git
|
||||
#
|
||||
# [submodule "services/arromis-brand"]
|
||||
# path = services/arromis-brand
|
||||
# url = https://github.com/the-order/arromis-brand.git
|
||||
|
||||
12
.prettierignore
Normal file
12
.prettierignore
Normal file
@@ -0,0 +1,12 @@
|
||||
node_modules
|
||||
dist
|
||||
build
|
||||
.next
|
||||
coverage
|
||||
*.min.js
|
||||
*.min.css
|
||||
package-lock.json
|
||||
pnpm-lock.yaml
|
||||
yarn.lock
|
||||
.turbo
|
||||
|
||||
10
.prettierrc
Normal file
10
.prettierrc
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"semi": true,
|
||||
"trailingComma": "es5",
|
||||
"singleQuote": true,
|
||||
"printWidth": 100,
|
||||
"tabWidth": 2,
|
||||
"useTabs": false,
|
||||
"arrowParens": "avoid"
|
||||
}
|
||||
|
||||
22
LICENSE
Normal file
22
LICENSE
Normal file
@@ -0,0 +1,22 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 The Order
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
35
NOTICE
Normal file
35
NOTICE
Normal file
@@ -0,0 +1,35 @@
|
||||
The Order
|
||||
Copyright (c) 2024 The Order
|
||||
|
||||
This product includes software developed by The Order and its contributors.
|
||||
|
||||
Third-Party Components:
|
||||
|
||||
This product may include the following third-party components:
|
||||
|
||||
1. Node.js - https://nodejs.org/
|
||||
Copyright Node.js contributors. All rights reserved.
|
||||
|
||||
2. TypeScript - https://www.typescriptlang.org/
|
||||
Copyright Microsoft Corporation. All rights reserved.
|
||||
|
||||
3. React - https://react.dev/
|
||||
Copyright Facebook, Inc. and its affiliates.
|
||||
|
||||
4. Next.js - https://nextjs.org/
|
||||
Copyright Vercel, Inc.
|
||||
|
||||
5. Turborepo - https://turbo.build/
|
||||
Copyright Vercel, Inc.
|
||||
|
||||
6. pnpm - https://pnpm.io/
|
||||
Copyright Zoltan Kochan and contributors.
|
||||
|
||||
For a complete list of third-party components and their licenses, please see the
|
||||
package.json files in each workspace or run:
|
||||
|
||||
pnpm licenses list
|
||||
|
||||
Additional third-party notices and attributions may be found in individual
|
||||
package directories.
|
||||
|
||||
155
QUICKSTART.md
Normal file
155
QUICKSTART.md
Normal file
@@ -0,0 +1,155 @@
|
||||
# Quickstart Guide
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js >= 18.0.0
|
||||
- pnpm >= 8.0.0
|
||||
- Docker (for local development services)
|
||||
- Git
|
||||
|
||||
### Initial Setup
|
||||
|
||||
1. **Clone the repository**
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd the-order
|
||||
```
|
||||
|
||||
2. **Install dependencies**
|
||||
```bash
|
||||
pnpm install
|
||||
```
|
||||
|
||||
3. **Start development services** (PostgreSQL, Redis, OpenSearch)
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
4. **Build all packages**
|
||||
```bash
|
||||
pnpm build
|
||||
```
|
||||
|
||||
5. **Start development servers**
|
||||
```bash
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### Development Workflow
|
||||
|
||||
1. **Work on a specific package**
|
||||
```bash
|
||||
cd packages/ui
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
2. **Work on an app**
|
||||
```bash
|
||||
cd apps/portal-public
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
3. **Work on a service**
|
||||
```bash
|
||||
cd services/intake
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### Running Tests
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
pnpm test
|
||||
|
||||
# Run tests for a specific package
|
||||
pnpm --filter @the-order/ui test
|
||||
|
||||
# Run tests in watch mode
|
||||
pnpm --filter @the-order/ui test:watch
|
||||
```
|
||||
|
||||
### Adding Git Submodules
|
||||
|
||||
To add external repositories as submodules:
|
||||
|
||||
```bash
|
||||
./scripts/add-submodules.sh
|
||||
```
|
||||
|
||||
Or manually:
|
||||
|
||||
```bash
|
||||
git submodule add <repository-url> services/omnis-brand
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
1. Copy `.env.example` to `.env.local` in each workspace
|
||||
2. Configure required environment variables
|
||||
3. For secrets, use SOPS (see `docs/governance/SECURITY.md`)
|
||||
|
||||
### Building for Production
|
||||
|
||||
```bash
|
||||
# Build all packages and apps
|
||||
pnpm build
|
||||
|
||||
# Build specific workspace
|
||||
pnpm --filter @the-order/portal-public build
|
||||
```
|
||||
|
||||
### Deployment
|
||||
|
||||
See `infra/README.md` for infrastructure and deployment documentation.
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. Review the [README.md](README.md) for detailed documentation
|
||||
2. Read [CONTRIBUTING.md](docs/governance/CONTRIBUTING.md) for contribution guidelines
|
||||
3. Check [SECURITY.md](docs/governance/SECURITY.md) for security policies
|
||||
4. Explore the architecture in [docs/architecture/](docs/architecture/)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Issues with dependencies
|
||||
|
||||
```bash
|
||||
# Clean and reinstall
|
||||
pnpm clean
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### Issues with Docker services
|
||||
|
||||
```bash
|
||||
# Restart services
|
||||
docker-compose restart
|
||||
|
||||
# View logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Reset services
|
||||
docker-compose down -v
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### TypeScript errors
|
||||
|
||||
```bash
|
||||
# Run type checking
|
||||
pnpm type-check
|
||||
|
||||
# Clean build artifacts
|
||||
pnpm clean
|
||||
pnpm build
|
||||
```
|
||||
|
||||
## Getting Help
|
||||
|
||||
- Check the [documentation](docs/)
|
||||
- Open an [issue](.github/ISSUE_TEMPLATE/)
|
||||
- Review [architecture decisions](docs/architecture/adrs/)
|
||||
|
||||
183
README.md
183
README.md
@@ -1,2 +1,181 @@
|
||||
# the-order-monorepo
|
||||
# the-order-monorepo
|
||||
# The Order
|
||||
|
||||
Monorepo for The Order - A comprehensive platform for legal, financial, and governance systems.
|
||||
|
||||
## Overview
|
||||
|
||||
The Order is a mono-repo containing all applications, services, packages, infrastructure, and documentation for managing legal documents, financial systems, identity management, datarooms, and member portals.
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
the-order/
|
||||
├─ apps/ # End-user applications (web + portals)
|
||||
│ ├─ portal-public/ # Public web presence
|
||||
│ ├─ portal-internal/ # Internal web (admin/ops)
|
||||
│ ├─ mcp-members/ # MCP for Members of The Order
|
||||
│ └─ mcp-legal/ # MCP for Legal Purpose (matters, filings, attestations)
|
||||
│
|
||||
├─ services/ # Domain services (APIs, workers)
|
||||
│ ├─ intake/ # "Drop content" tool: ingestion → OCR → classify → route
|
||||
│ ├─ identity/ # Digital Systems (eIDAS/DID, verifiable credentials)
|
||||
│ ├─ finance/ # Requisite financial systems (payments, ledgers, rates)
|
||||
│ ├─ dataroom/ # Dataroom(s) for all deals (secure VDR, deal room APIs)
|
||||
│ ├─ omnis-brand/ # Branded version of OMNIS (as a service/app shell)
|
||||
│ └─ arromis-brand/ # Branded version of ARROMIS (as a service/app shell)
|
||||
│
|
||||
├─ packages/ # Shared libraries (versioned in the mono-repo)
|
||||
│ ├─ ui/ # Design system (React/Tailwind components)
|
||||
│ ├─ schemas/ # Zod/OpenAPI/JSON Schema contracts
|
||||
│ ├─ auth/ # AuthZ/AuthN helpers (OIDC, wallet, eIDAS adapters)
|
||||
│ ├─ storage/ # S3/GCS abstraction, object lifecycle, WORM mode
|
||||
│ ├─ crypto/ # KMS/HSM client, key mgmt, signatures (eIDAS/DID)
|
||||
│ ├─ workflows/ # Temporal/Step Functions definitions
|
||||
│ └─ test-utils/ # Testing utilities and helpers
|
||||
│
|
||||
├─ infra/ # Everything-as-code
|
||||
│ ├─ terraform/ # Cloud infra, secrets backends, KMS/HSM, PKI
|
||||
│ ├─ k8s/ # Helm charts/overlays (dev/stage/prod)
|
||||
│ ├─ gateways/ # API gateway / proxy / WAF configs
|
||||
│ └─ cicd/ # Reusable CI templates, SBOM, signing
|
||||
│
|
||||
├─ docs/ # Living documentation
|
||||
│ ├─ legal/ # Generated legal/treaty artifacts, policies
|
||||
│ ├─ governance/ # Contribution, security, incident runbooks
|
||||
│ ├─ architecture/ # ADRs, data flows, threat models
|
||||
│ └─ product/ # Roadmaps, PRDs
|
||||
│
|
||||
└─ scripts/ # Utility scripts
|
||||
```
|
||||
|
||||
## Quickstart
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js >= 18.0.0
|
||||
- pnpm >= 8.0.0
|
||||
- Git
|
||||
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://github.com/the-order/the-order.git
|
||||
cd the-order
|
||||
|
||||
# Initialize submodules (if any)
|
||||
git submodule update --init --recursive
|
||||
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Build all packages
|
||||
pnpm build
|
||||
```
|
||||
|
||||
### Development
|
||||
|
||||
```bash
|
||||
# Start all apps and services in development mode
|
||||
pnpm dev
|
||||
|
||||
# Run specific workspace
|
||||
pnpm --filter portal-public dev
|
||||
|
||||
# Run linting
|
||||
pnpm lint
|
||||
|
||||
# Run type checking
|
||||
pnpm type-check
|
||||
|
||||
# Run tests
|
||||
pnpm test
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Environment variables are managed using SOPS (Secrets Operations). See `docs/governance/SECURITY.md` for details.
|
||||
|
||||
1. Copy `.env.example` files to `.env.local` in each workspace
|
||||
2. For encrypted secrets, use SOPS with age keys
|
||||
3. Never commit plaintext secrets to the repository
|
||||
|
||||
Example:
|
||||
```bash
|
||||
# Decrypt and load secrets
|
||||
sops -d secrets/dev.env.enc > .env.local
|
||||
```
|
||||
|
||||
## Environments
|
||||
|
||||
- **dev**: Local development environment
|
||||
- **stage**: Staging environment for testing
|
||||
- **prod**: Production environment
|
||||
|
||||
Environment-specific configurations are in `infra/k8s/overlays/`.
|
||||
|
||||
## Git Submodules
|
||||
|
||||
Some services and apps are managed as Git submodules. To add submodules:
|
||||
|
||||
```bash
|
||||
# See scripts/add-submodules.sh for examples
|
||||
./scripts/add-submodules.sh
|
||||
```
|
||||
|
||||
To update submodules:
|
||||
```bash
|
||||
git submodule update --remote
|
||||
```
|
||||
|
||||
## Contribution
|
||||
|
||||
Please read [CONTRIBUTING.md](docs/governance/CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests.
|
||||
|
||||
### Development Workflow
|
||||
|
||||
1. Create a feature branch from `main`
|
||||
2. Make your changes
|
||||
3. Run tests and linting: `pnpm test && pnpm lint`
|
||||
4. Commit using [Conventional Commits](https://www.conventionalcommits.org/)
|
||||
5. Push and create a Pull Request
|
||||
|
||||
### Code Standards
|
||||
|
||||
- TypeScript strict mode enabled
|
||||
- ESLint + Prettier for code formatting
|
||||
- All tests must pass
|
||||
- Type checking must pass
|
||||
- Follow the architecture decisions in `docs/architecture/adrs/`
|
||||
|
||||
## Security
|
||||
|
||||
See [SECURITY.md](docs/governance/SECURITY.md) for security policies and reporting procedures.
|
||||
|
||||
## Architecture
|
||||
|
||||
Architecture Decision Records (ADRs) are located in `docs/architecture/adrs/`. See [docs/architecture/README.md](docs/architecture/README.md) for more information.
|
||||
|
||||
## Release Process
|
||||
|
||||
Releases are managed via semantic versioning and automated through CI/CD:
|
||||
|
||||
1. Merge to `main` triggers automated tests and builds
|
||||
2. Tagged releases trigger deployment to staging
|
||||
3. Manual approval required for production deployment
|
||||
4. See `.github/workflows/release.yml` for details
|
||||
|
||||
## License
|
||||
|
||||
See [LICENSE](LICENSE) for license information.
|
||||
|
||||
## Support
|
||||
|
||||
For questions and support, please open an issue in this repository.
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [Security Policy](docs/governance/SECURITY.md)
|
||||
- [Contributing Guide](docs/governance/CONTRIBUTING.md)
|
||||
- [Architecture Documentation](docs/architecture/README.md)
|
||||
- [Product Roadmap](docs/product/README.md)
|
||||
|
||||
31
apps/mcp-legal/README.md
Normal file
31
apps/mcp-legal/README.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# MCP Legal
|
||||
|
||||
MCP server for Legal Purpose (matters, filings, attestations).
|
||||
|
||||
## Features
|
||||
|
||||
- Matter management
|
||||
- Signature orchestration
|
||||
- Legal-grade record retention
|
||||
- Treaty registry
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Run development server
|
||||
pnpm dev
|
||||
|
||||
# Build
|
||||
pnpm build
|
||||
|
||||
# Start production server
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Configure this MCP server in your MCP client to access legal management features.
|
||||
|
||||
24
apps/mcp-legal/package.json
Normal file
24
apps/mcp-legal/package.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "@the-order/mcp-legal",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "MCP server for Legal Purpose (matters, filings, attestations)",
|
||||
"main": "./src/index.ts",
|
||||
"scripts": {
|
||||
"dev": "tsx watch src/index.ts",
|
||||
"build": "tsc",
|
||||
"start": "node dist/index.js",
|
||||
"lint": "eslint src --ext .ts",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@modelcontextprotocol/sdk": "^0.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3",
|
||||
"tsx": "^4.7.0",
|
||||
"eslint": "^8.56.0"
|
||||
}
|
||||
}
|
||||
|
||||
32
apps/mcp-legal/src/index.ts
Normal file
32
apps/mcp-legal/src/index.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* MCP server for Legal Purpose (matters, filings, attestations)
|
||||
*/
|
||||
|
||||
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
||||
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
||||
|
||||
const server = new Server(
|
||||
{
|
||||
name: 'mcp-legal',
|
||||
version: '0.1.0',
|
||||
},
|
||||
{
|
||||
capabilities: {
|
||||
tools: {},
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
// Initialize server
|
||||
async function main() {
|
||||
const transport = new StdioServerTransport();
|
||||
await server.connect(transport);
|
||||
console.error('MCP Legal server running on stdio');
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error('Error starting server:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
10
apps/mcp-legal/tsconfig.json
Normal file
10
apps/mcp-legal/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
31
apps/mcp-members/README.md
Normal file
31
apps/mcp-members/README.md
Normal file
@@ -0,0 +1,31 @@
|
||||
# MCP Members
|
||||
|
||||
MCP server for Members of The Order.
|
||||
|
||||
## Features
|
||||
|
||||
- Membership management
|
||||
- Credential wallet
|
||||
- Role entitlements
|
||||
- Dataroom access
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Run development server
|
||||
pnpm dev
|
||||
|
||||
# Build
|
||||
pnpm build
|
||||
|
||||
# Start production server
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Configure this MCP server in your MCP client to access member management features.
|
||||
|
||||
24
apps/mcp-members/package.json
Normal file
24
apps/mcp-members/package.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "@the-order/mcp-members",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "MCP server for Members of The Order",
|
||||
"main": "./src/index.ts",
|
||||
"scripts": {
|
||||
"dev": "tsx watch src/index.ts",
|
||||
"build": "tsc",
|
||||
"start": "node dist/index.js",
|
||||
"lint": "eslint src --ext .ts",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@modelcontextprotocol/sdk": "^0.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3",
|
||||
"tsx": "^4.7.0",
|
||||
"eslint": "^8.56.0"
|
||||
}
|
||||
}
|
||||
|
||||
32
apps/mcp-members/src/index.ts
Normal file
32
apps/mcp-members/src/index.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* MCP server for Members of The Order
|
||||
*/
|
||||
|
||||
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
||||
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
||||
|
||||
const server = new Server(
|
||||
{
|
||||
name: 'mcp-members',
|
||||
version: '0.1.0',
|
||||
},
|
||||
{
|
||||
capabilities: {
|
||||
tools: {},
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
// Initialize server
|
||||
async function main() {
|
||||
const transport = new StdioServerTransport();
|
||||
await server.connect(transport);
|
||||
console.error('MCP Members server running on stdio');
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
console.error('Error starting server:', error);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
10
apps/mcp-members/tsconfig.json
Normal file
10
apps/mcp-members/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
28
apps/portal-internal/README.md
Normal file
28
apps/portal-internal/README.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Portal Internal
|
||||
|
||||
Internal web portal for The Order (admin/ops).
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Run development server (port 3001)
|
||||
pnpm dev
|
||||
|
||||
# Build for production
|
||||
pnpm build
|
||||
|
||||
# Start production server
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
See `.env.example` for required environment variables.
|
||||
|
||||
## Authentication
|
||||
|
||||
This portal requires authentication. Configure OIDC/DID settings in environment variables.
|
||||
|
||||
8
apps/portal-internal/next.config.js
Normal file
8
apps/portal-internal/next.config.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
transpilePackages: ['@the-order/ui', '@the-order/schemas', '@the-order/auth'],
|
||||
};
|
||||
|
||||
module.exports = nextConfig;
|
||||
|
||||
29
apps/portal-internal/package.json
Normal file
29
apps/portal-internal/package.json
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"name": "@the-order/portal-internal",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev -p 3001",
|
||||
"build": "next build",
|
||||
"start": "next start -p 3001",
|
||||
"lint": "next lint",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "^14.0.4",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"@the-order/ui": "workspace:*",
|
||||
"@the-order/schemas": "workspace:*",
|
||||
"@the-order/auth": "workspace:*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"@types/react": "^18.2.45",
|
||||
"@types/react-dom": "^18.2.18",
|
||||
"typescript": "^5.3.3",
|
||||
"eslint": "^8.56.0",
|
||||
"eslint-config-next": "^14.0.4"
|
||||
}
|
||||
}
|
||||
|
||||
19
apps/portal-internal/src/app/layout.tsx
Normal file
19
apps/portal-internal/src/app/layout.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import type { Metadata } from 'next';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'The Order - Internal Portal',
|
||||
description: 'Internal portal for The Order (admin/ops)',
|
||||
};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
9
apps/portal-internal/src/app/page.tsx
Normal file
9
apps/portal-internal/src/app/page.tsx
Normal file
@@ -0,0 +1,9 @@
|
||||
export default function Home() {
|
||||
return (
|
||||
<main>
|
||||
<h1>The Order - Internal Portal</h1>
|
||||
<p>Welcome to The Order internal portal (admin/ops).</p>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
32
apps/portal-internal/tsconfig.json
Normal file
32
apps/portal-internal/tsconfig.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"target": "ES2020",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"],
|
||||
"@the-order/ui": ["../../packages/ui/src"],
|
||||
"@the-order/schemas": ["../../packages/schemas/src"],
|
||||
"@the-order/auth": ["../../packages/auth/src"]
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
||||
24
apps/portal-public/README.md
Normal file
24
apps/portal-public/README.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Portal Public
|
||||
|
||||
Public web presence for The Order.
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Run development server
|
||||
pnpm dev
|
||||
|
||||
# Build for production
|
||||
pnpm build
|
||||
|
||||
# Start production server
|
||||
pnpm start
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
See `.env.example` for required environment variables.
|
||||
|
||||
8
apps/portal-public/next.config.js
Normal file
8
apps/portal-public/next.config.js
Normal file
@@ -0,0 +1,8 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
reactStrictMode: true,
|
||||
transpilePackages: ['@the-order/ui', '@the-order/schemas'],
|
||||
};
|
||||
|
||||
module.exports = nextConfig;
|
||||
|
||||
28
apps/portal-public/package.json
Normal file
28
apps/portal-public/package.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "@the-order/portal-public",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "^14.0.4",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"@the-order/ui": "workspace:*",
|
||||
"@the-order/schemas": "workspace:*"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"@types/react": "^18.2.45",
|
||||
"@types/react-dom": "^18.2.18",
|
||||
"typescript": "^5.3.3",
|
||||
"eslint": "^8.56.0",
|
||||
"eslint-config-next": "^14.0.4"
|
||||
}
|
||||
}
|
||||
|
||||
19
apps/portal-public/src/app/layout.tsx
Normal file
19
apps/portal-public/src/app/layout.tsx
Normal file
@@ -0,0 +1,19 @@
|
||||
import type { Metadata } from 'next';
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: 'The Order - Public Portal',
|
||||
description: 'Public portal for The Order',
|
||||
};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>{children}</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
9
apps/portal-public/src/app/page.tsx
Normal file
9
apps/portal-public/src/app/page.tsx
Normal file
@@ -0,0 +1,9 @@
|
||||
export default function Home() {
|
||||
return (
|
||||
<main>
|
||||
<h1>The Order - Public Portal</h1>
|
||||
<p>Welcome to The Order public portal.</p>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
31
apps/portal-public/tsconfig.json
Normal file
31
apps/portal-public/tsconfig.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"target": "ES2020",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "preserve",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"],
|
||||
"@the-order/ui": ["../../packages/ui/src"],
|
||||
"@the-order/schemas": ["../../packages/schemas/src"]
|
||||
}
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
||||
64
docker-compose.yml
Normal file
64
docker-compose.yml
Normal file
@@ -0,0 +1,64 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:15-alpine
|
||||
environment:
|
||||
POSTGRES_USER: theorder
|
||||
POSTGRES_PASSWORD: theorder_dev
|
||||
POSTGRES_DB: theorder_dev
|
||||
ports:
|
||||
- "5432:5432"
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U theorder"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
opensearch:
|
||||
image: opensearchproject/opensearch:2.11.0
|
||||
environment:
|
||||
- discovery.type=single-node
|
||||
- "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||
- "DISABLE_SECURITY_PLUGIN=true"
|
||||
ports:
|
||||
- "9200:9200"
|
||||
- "9600:9600"
|
||||
volumes:
|
||||
- opensearch_data:/usr/share/opensearch/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
opensearch-dashboards:
|
||||
image: opensearchproject/opensearch-dashboards:2.11.0
|
||||
ports:
|
||||
- "5601:5601"
|
||||
environment:
|
||||
- 'OPENSEARCH_HOSTS=["http://opensearch:9200"]'
|
||||
- "DISABLE_SECURITY_DASHBOARDS_PLUGIN=true"
|
||||
depends_on:
|
||||
opensearch:
|
||||
condition: service_healthy
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
opensearch_data:
|
||||
|
||||
236
docs/architecture/README.md
Normal file
236
docs/architecture/README.md
Normal file
@@ -0,0 +1,236 @@
|
||||
# Architecture Documentation
|
||||
|
||||
This directory contains architecture documentation for The Order, including Architecture Decision Records (ADRs), data flow diagrams, and threat models.
|
||||
|
||||
## Architecture Decision Records (ADRs)
|
||||
|
||||
Architecture Decision Records document important architectural decisions made in the project. They capture the context, decision, and consequences of key choices.
|
||||
|
||||
### ADR Template
|
||||
|
||||
When creating a new ADR, use the template in `adrs/README.md`.
|
||||
|
||||
### Current ADRs
|
||||
|
||||
- See `adrs/` directory for all ADRs
|
||||
- ADRs are numbered sequentially: `adr-001-*.md`, `adr-002-*.md`, etc.
|
||||
|
||||
### ADR Process
|
||||
|
||||
1. Propose an architectural decision
|
||||
2. Create ADR using template
|
||||
3. Discuss with team
|
||||
4. Record decision in ADR
|
||||
5. Update as needed if decision changes
|
||||
|
||||
## System Architecture
|
||||
|
||||
### High-Level Overview
|
||||
|
||||
```
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ Portal │────▶│ Services │────▶│ Databases │
|
||||
│ Apps │ │ (APIs) │ │ & Storage │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
│ │ │
|
||||
└───────────────────┴────────────────────┘
|
||||
│
|
||||
┌──────┴──────┐
|
||||
│ Identity │
|
||||
│ & Auth │
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
### Core Services
|
||||
|
||||
1. **Intake Service**: Document ingestion, OCR, classification
|
||||
2. **Identity Service**: eIDAS/DID, verifiable credentials
|
||||
3. **Finance Service**: Payments, ledgers, rate management
|
||||
4. **Dataroom Service**: Secure VDR, deal rooms
|
||||
5. **MCP Services**: Member and legal management portals
|
||||
|
||||
### Data Flow
|
||||
|
||||
#### Content Intake Flow
|
||||
|
||||
```
|
||||
Document Upload → Intake Service → OCR → Classification →
|
||||
Storage (WORM) → Indexing → Workflow Trigger
|
||||
```
|
||||
|
||||
#### Identity Flow
|
||||
|
||||
```
|
||||
User Request → Identity Service → eIDAS/DID Verification →
|
||||
VC Issuance → Wallet Storage → Access Grant
|
||||
```
|
||||
|
||||
#### Dataroom Flow
|
||||
|
||||
```
|
||||
Deal Creation → Dataroom Service → Document Upload →
|
||||
Access Control (OPA) → Watermarking → Presigned URLs
|
||||
```
|
||||
|
||||
## Technology Stack
|
||||
|
||||
### Frontend
|
||||
|
||||
- **Framework**: Next.js 14+
|
||||
- **UI Library**: React 18+
|
||||
- **Styling**: Tailwind CSS
|
||||
- **Components**: shadcn/ui
|
||||
- **State Management**: Zustand / React Query
|
||||
|
||||
### Backend
|
||||
|
||||
- **Runtime**: Node.js 18+ (TypeScript)
|
||||
- **API Framework**: NestJS / Fastify
|
||||
- **Workflow Engine**: Temporal / AWS Step Functions
|
||||
- **Message Queue**: Redis / Kafka
|
||||
|
||||
### Infrastructure
|
||||
|
||||
- **Container Orchestration**: Kubernetes
|
||||
- **Infrastructure as Code**: Terraform
|
||||
- **CI/CD**: GitHub Actions
|
||||
- **Monitoring**: OpenTelemetry + Grafana
|
||||
- **Logging**: Structured logging (JSON)
|
||||
|
||||
### Data Stores
|
||||
|
||||
- **Primary Database**: PostgreSQL
|
||||
- **Cache**: Redis
|
||||
- **Search**: OpenSearch
|
||||
- **Object Storage**: S3 / GCS (WORM mode)
|
||||
- **Key Management**: KMS / HSM
|
||||
|
||||
### Security
|
||||
|
||||
- **Secrets Management**: SOPS + age / External Secrets
|
||||
- **Identity**: OIDC + DID (did:key, did:web)
|
||||
- **Signing**: eIDAS qualified signatures
|
||||
- **Policy Engine**: OPA (Open Policy Agent)
|
||||
- **SBOM**: Syft
|
||||
- **Vulnerability Scanning**: Grype
|
||||
- **Image Signing**: Cosign
|
||||
|
||||
## Design Principles
|
||||
|
||||
1. **Security First**: All systems designed with security in mind
|
||||
2. **Immutable Infrastructure**: Infrastructure as code, version controlled
|
||||
3. **Observability**: Comprehensive logging, metrics, and tracing
|
||||
4. **Scalability**: Horizontal scaling, stateless services
|
||||
5. **Resilience**: Graceful degradation, circuit breakers
|
||||
6. **Compliance**: eIDAS, data retention, audit trails
|
||||
|
||||
## Threat Models
|
||||
|
||||
Threat models for each service are located in `threat-models/`. They use STRIDE methodology:
|
||||
|
||||
- **S**poofing
|
||||
- **T**ampering
|
||||
- **R**epudiation
|
||||
- **I**nformation Disclosure
|
||||
- **D**enial of Service
|
||||
- **E**levation of Privilege
|
||||
|
||||
## Data Models
|
||||
|
||||
### Core Entities
|
||||
|
||||
- **User**: Member of The Order
|
||||
- **Document**: Legal document, treaty, etc.
|
||||
- **Deal**: Business transaction with dataroom
|
||||
- **Matter**: Legal matter with associated documents
|
||||
- **Identity**: Digital identity (eIDAS/DID)
|
||||
- **Credential**: Verifiable credential
|
||||
|
||||
### Relationships
|
||||
|
||||
See entity relationship diagrams in `data-models/`.
|
||||
|
||||
## API Design
|
||||
|
||||
### REST APIs
|
||||
|
||||
- Follow RESTful principles
|
||||
- Use OpenAPI/Swagger for documentation
|
||||
- Version APIs: `/v1/`, `/v2/`, etc.
|
||||
- Use proper HTTP status codes
|
||||
- Include request/response examples
|
||||
|
||||
### GraphQL (if applicable)
|
||||
|
||||
- Use GraphQL for complex queries
|
||||
- Implement proper authorization
|
||||
- Use DataLoader for N+1 queries
|
||||
|
||||
## Deployment Architecture
|
||||
|
||||
### Environments
|
||||
|
||||
- **Development**: Local development
|
||||
- **Staging**: Pre-production testing
|
||||
- **Production**: Live environment
|
||||
|
||||
### Deployment Strategy
|
||||
|
||||
- **Blue-Green Deployment**: For zero-downtime updates
|
||||
- **Canary Releases**: For gradual rollouts
|
||||
- **Feature Flags**: For controlled feature releases
|
||||
|
||||
### Infrastructure Regions
|
||||
|
||||
- Primary region: EU (for eIDAS compliance)
|
||||
- Secondary region: Backup/DR
|
||||
- CDN: Global distribution for static assets
|
||||
|
||||
## Monitoring & Observability
|
||||
|
||||
### Metrics
|
||||
|
||||
- Application metrics (Prometheus)
|
||||
- Infrastructure metrics (cloud provider)
|
||||
- Business metrics (custom dashboards)
|
||||
|
||||
### Logging
|
||||
|
||||
- Structured logging (JSON)
|
||||
- Centralized log aggregation
|
||||
- Log retention policies
|
||||
|
||||
### Tracing
|
||||
|
||||
- Distributed tracing (OpenTelemetry)
|
||||
- Request flow visualization
|
||||
- Performance analysis
|
||||
|
||||
## Disaster Recovery
|
||||
|
||||
### Backup Strategy
|
||||
|
||||
- Database backups: Daily full, hourly incremental
|
||||
- Object storage: Cross-region replication
|
||||
- Configuration: Version controlled
|
||||
|
||||
### Recovery Procedures
|
||||
|
||||
- RTO (Recovery Time Objective): 4 hours
|
||||
- RPO (Recovery Point Objective): 1 hour
|
||||
- Runbooks in `docs/governance/runbooks/`
|
||||
|
||||
## Future Considerations
|
||||
|
||||
- Multi-cloud deployment
|
||||
- Edge computing for low latency
|
||||
- Machine learning for document classification
|
||||
- Blockchain integration for notarization
|
||||
|
||||
## References
|
||||
|
||||
- [ADR Template](adrs/README.md)
|
||||
- [Threat Models](threat-models/)
|
||||
- [Data Models](data-models/)
|
||||
- [API Documentation](../api/)
|
||||
|
||||
65
docs/architecture/adrs/README.md
Normal file
65
docs/architecture/adrs/README.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# Architecture Decision Records
|
||||
|
||||
This directory contains Architecture Decision Records (ADRs) for The Order project.
|
||||
|
||||
## What is an ADR?
|
||||
|
||||
An Architecture Decision Record is a document that captures an important architectural decision made along with its context and consequences.
|
||||
|
||||
## ADR Format
|
||||
|
||||
Each ADR should follow this structure:
|
||||
|
||||
```markdown
|
||||
# ADR-XXX: [Title]
|
||||
|
||||
## Status
|
||||
[Proposed | Accepted | Deprecated | Superseded]
|
||||
|
||||
## Context
|
||||
Describe the issue that is motivating this decision or change.
|
||||
|
||||
## Decision
|
||||
State the architectural decision that is being made.
|
||||
|
||||
## Consequences
|
||||
Describe the consequences, both positive and negative, of this decision.
|
||||
|
||||
## Alternatives Considered
|
||||
List alternatives that were considered and why they were rejected.
|
||||
|
||||
## References
|
||||
Links to related ADRs, issues, or documentation.
|
||||
```
|
||||
|
||||
## ADR Numbering
|
||||
|
||||
ADRs are numbered sequentially:
|
||||
- `adr-001-*.md`
|
||||
- `adr-002-*.md`
|
||||
- etc.
|
||||
|
||||
## Creating a New ADR
|
||||
|
||||
1. Create a new file: `adr-XXX-short-title.md`
|
||||
2. Use the template above
|
||||
3. Set status to "Proposed"
|
||||
4. Create a PR for discussion
|
||||
5. Update status to "Accepted" after approval
|
||||
|
||||
## ADR Lifecycle
|
||||
|
||||
1. **Proposed**: Initial proposal, under discussion
|
||||
2. **Accepted**: Decision has been made and approved
|
||||
3. **Deprecated**: Decision is no longer followed
|
||||
4. **Superseded**: Replaced by a newer ADR
|
||||
|
||||
## Current ADRs
|
||||
|
||||
*No ADRs yet. Create the first one using the template above.*
|
||||
|
||||
## References
|
||||
|
||||
- [ADR Template](https://github.com/joelparkerhenderson/architecture-decision-record)
|
||||
- [Documenting Architecture Decisions](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)
|
||||
|
||||
235
docs/governance/CONTRIBUTING.md
Normal file
235
docs/governance/CONTRIBUTING.md
Normal file
@@ -0,0 +1,235 @@
|
||||
# Contributing to The Order
|
||||
|
||||
Thank you for your interest in contributing to The Order! This document provides guidelines and instructions for contributing.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
By participating in this project, you agree to maintain a respectful and inclusive environment for all contributors.
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Fork the repository
|
||||
2. Clone your fork: `git clone https://github.com/your-username/the-order.git`
|
||||
3. Create a branch: `git checkout -b feature/your-feature-name`
|
||||
4. Install dependencies: `pnpm install`
|
||||
5. Make your changes
|
||||
6. Test your changes: `pnpm test && pnpm lint`
|
||||
7. Commit your changes (see [Commit Guidelines](#commit-guidelines))
|
||||
8. Push to your fork: `git push origin feature/your-feature-name`
|
||||
9. Open a Pull Request
|
||||
|
||||
## Development Setup
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Node.js >= 18.0.0
|
||||
- pnpm >= 8.0.0
|
||||
- Docker (for local services)
|
||||
- Git
|
||||
|
||||
### Local Development
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
pnpm install
|
||||
|
||||
# Start development servers
|
||||
pnpm dev
|
||||
|
||||
# Run tests
|
||||
pnpm test
|
||||
|
||||
# Run linting
|
||||
pnpm lint
|
||||
|
||||
# Type check
|
||||
pnpm type-check
|
||||
```
|
||||
|
||||
### Environment Setup
|
||||
|
||||
1. Copy `.env.example` to `.env.local` in the workspace you're working on
|
||||
2. Configure required environment variables
|
||||
3. For secrets, use SOPS (see [Security Policy](SECURITY.md))
|
||||
|
||||
## Commit Guidelines
|
||||
|
||||
We use [Conventional Commits](https://www.conventionalcommits.org/) for commit messages:
|
||||
|
||||
```
|
||||
<type>(<scope>): <subject>
|
||||
|
||||
<body>
|
||||
|
||||
<footer>
|
||||
```
|
||||
|
||||
### Types
|
||||
|
||||
- `feat`: New feature
|
||||
- `fix`: Bug fix
|
||||
- `docs`: Documentation changes
|
||||
- `style`: Code style changes (formatting, etc.)
|
||||
- `refactor`: Code refactoring
|
||||
- `test`: Test additions or changes
|
||||
- `chore`: Build process or auxiliary tool changes
|
||||
- `perf`: Performance improvements
|
||||
- `ci`: CI/CD changes
|
||||
- `revert`: Revert a previous commit
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
feat(auth): add OIDC provider support
|
||||
|
||||
Implement OAuth2/OIDC flow with support for multiple providers.
|
||||
Adds configuration for eIDAS integration.
|
||||
|
||||
Closes #123
|
||||
```
|
||||
|
||||
```
|
||||
fix(intake): resolve OCR parsing issue with PDFs
|
||||
|
||||
Fixes character encoding problems when processing multi-page PDFs.
|
||||
Adds proper error handling for corrupted documents.
|
||||
|
||||
Fixes #456
|
||||
```
|
||||
|
||||
## Pull Request Process
|
||||
|
||||
1. **Update Documentation**: Update relevant documentation for your changes
|
||||
2. **Add Tests**: Include tests for new features or bug fixes
|
||||
3. **Update Changelog**: Add entry to CHANGELOG.md (if applicable)
|
||||
4. **Ensure Tests Pass**: All CI checks must pass
|
||||
5. **Request Review**: Request review from relevant code owners (see CODEOWNERS)
|
||||
|
||||
### PR Title Format
|
||||
|
||||
Use the same format as commit messages:
|
||||
|
||||
```
|
||||
feat(scope): brief description
|
||||
```
|
||||
|
||||
### PR Description Template
|
||||
|
||||
```markdown
|
||||
## Description
|
||||
Brief description of changes
|
||||
|
||||
## Type of Change
|
||||
- [ ] Bug fix
|
||||
- [ ] New feature
|
||||
- [ ] Breaking change
|
||||
- [ ] Documentation update
|
||||
|
||||
## Testing
|
||||
How was this tested?
|
||||
|
||||
## Checklist
|
||||
- [ ] Code follows style guidelines
|
||||
- [ ] Self-review completed
|
||||
- [ ] Comments added for complex code
|
||||
- [ ] Documentation updated
|
||||
- [ ] Tests added/updated
|
||||
- [ ] All tests pass
|
||||
- [ ] No new warnings
|
||||
```
|
||||
|
||||
## Code Style
|
||||
|
||||
### TypeScript
|
||||
|
||||
- Use strict TypeScript configuration
|
||||
- Prefer type over interface for unions/intersections
|
||||
- Use explicit return types for public functions
|
||||
- Avoid `any` type
|
||||
|
||||
### Formatting
|
||||
|
||||
- Use Prettier for code formatting
|
||||
- Run `pnpm format` before committing
|
||||
- ESLint rules must pass
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
- Variables: `camelCase`
|
||||
- Functions: `camelCase`
|
||||
- Classes: `PascalCase`
|
||||
- Constants: `UPPER_SNAKE_CASE`
|
||||
- Files: `kebab-case` for utilities, `PascalCase` for components
|
||||
|
||||
## Testing
|
||||
|
||||
### Unit Tests
|
||||
|
||||
- Write unit tests for all new features
|
||||
- Aim for >80% code coverage
|
||||
- Use descriptive test names
|
||||
- Follow AAA pattern (Arrange, Act, Assert)
|
||||
|
||||
### Integration Tests
|
||||
|
||||
- Write integration tests for API endpoints
|
||||
- Test error cases and edge cases
|
||||
- Use test fixtures from `packages/test-utils`
|
||||
|
||||
### E2E Tests
|
||||
|
||||
- E2E tests for critical user flows
|
||||
- Use Playwright or similar framework
|
||||
- Run in CI/CD pipeline
|
||||
|
||||
## Documentation
|
||||
|
||||
### Code Documentation
|
||||
|
||||
- Document all public APIs
|
||||
- Use JSDoc for functions and classes
|
||||
- Include examples for complex usage
|
||||
|
||||
### Architecture Documentation
|
||||
|
||||
- Update ADRs for significant architectural decisions
|
||||
- Document new services in `docs/architecture/`
|
||||
- Update data flow diagrams if applicable
|
||||
|
||||
## Code Review
|
||||
|
||||
### For Authors
|
||||
|
||||
- Keep PRs focused and small
|
||||
- Respond to feedback promptly
|
||||
- Be open to suggestions
|
||||
- Update PR based on feedback
|
||||
|
||||
### For Reviewers
|
||||
|
||||
- Be constructive and respectful
|
||||
- Focus on code, not the person
|
||||
- Suggest improvements, don't just point out issues
|
||||
- Approve when satisfied
|
||||
|
||||
## Release Process
|
||||
|
||||
1. Create release branch from `main`
|
||||
2. Update version numbers
|
||||
3. Update CHANGELOG.md
|
||||
4. Create release PR
|
||||
5. After approval, tag release
|
||||
6. CI/CD automatically deploys
|
||||
|
||||
## Questions?
|
||||
|
||||
- Open an issue for questions
|
||||
- Check existing documentation
|
||||
- Ask in discussions
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- [Architecture Documentation](docs/architecture/README.md)
|
||||
- [Security Policy](SECURITY.md)
|
||||
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
||||
|
||||
105
docs/governance/SECURITY.md
Normal file
105
docs/governance/SECURITY.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
We currently support the following versions with security updates:
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 1.0.x | :white_check_mark: |
|
||||
| < 1.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
We take security vulnerabilities seriously. If you discover a security vulnerability, please follow these steps:
|
||||
|
||||
1. **Do NOT** open a public GitHub issue
|
||||
2. Email security details to: security@the-order.org (or your security contact)
|
||||
3. Include:
|
||||
- Description of the vulnerability
|
||||
- Steps to reproduce
|
||||
- Potential impact
|
||||
- Suggested fix (if any)
|
||||
|
||||
### Response Timeline
|
||||
|
||||
- **Initial Response**: Within 48 hours
|
||||
- **Status Update**: Within 7 days
|
||||
- **Fix Timeline**: Depends on severity (see below)
|
||||
|
||||
### Severity Levels
|
||||
|
||||
- **Critical**: Remote code execution, authentication bypass, data breach
|
||||
- Fix timeline: 24-48 hours
|
||||
- **High**: Privilege escalation, sensitive data exposure
|
||||
- Fix timeline: 7 days
|
||||
- **Medium**: Information disclosure, denial of service
|
||||
- Fix timeline: 30 days
|
||||
- **Low**: Best practices, defense in depth
|
||||
- Fix timeline: Next release cycle
|
||||
|
||||
## Security Practices
|
||||
|
||||
### Secrets Management
|
||||
|
||||
- All secrets must be encrypted using SOPS
|
||||
- Never commit plaintext secrets
|
||||
- Use environment variables for configuration
|
||||
- Rotate secrets regularly
|
||||
- Use short-lived tokens via OIDC
|
||||
|
||||
### Code Security
|
||||
|
||||
- All code must pass security linting (ESLint security plugins)
|
||||
- Dependencies are scanned for vulnerabilities (Grype)
|
||||
- Container images are signed (Cosign)
|
||||
- SBOM generation for all artifacts (Syft)
|
||||
|
||||
### Infrastructure Security
|
||||
|
||||
- Immutable infrastructure via Terraform
|
||||
- Secrets stored in KMS/HSM
|
||||
- Network policies enforced via Kubernetes
|
||||
- API gateway with WAF rules
|
||||
- Regular security audits and penetration testing
|
||||
|
||||
### Access Control
|
||||
|
||||
- Least privilege principle
|
||||
- Quarterly access reviews
|
||||
- MFA required for all production access
|
||||
- Audit logs for all sensitive operations
|
||||
|
||||
### Compliance
|
||||
|
||||
- eIDAS compliance for identity services
|
||||
- Data retention policies per jurisdiction
|
||||
- WORM storage for legal documents
|
||||
- Audit trails for all financial transactions
|
||||
|
||||
## Security Updates
|
||||
|
||||
Security updates are released as:
|
||||
- **Hotfixes**: For critical vulnerabilities
|
||||
- **Patch releases**: For high/medium severity issues
|
||||
- **Regular releases**: For low severity and general improvements
|
||||
|
||||
## Disclosure Policy
|
||||
|
||||
- Vulnerabilities are disclosed after a fix is available
|
||||
- Coordinated disclosure with responsible parties
|
||||
- CVE assignment for eligible vulnerabilities
|
||||
- Security advisories published in `docs/governance/security-advisories/`
|
||||
|
||||
## Contact
|
||||
|
||||
- **Security Email**: security@the-order.org
|
||||
- **PGP Key**: [Link to public key]
|
||||
- **Security Team**: @the-order/security-team
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- [Threat Models](docs/architecture/threat-models/)
|
||||
- [Incident Response Runbook](docs/governance/runbooks/incident-response.md)
|
||||
- [Security Checklist](docs/governance/security-checklist.md)
|
||||
|
||||
15
docs/legal/README.md
Normal file
15
docs/legal/README.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Legal Documentation
|
||||
|
||||
Generated legal/treaty artifacts, policies, and legal documentation.
|
||||
|
||||
## Contents
|
||||
|
||||
- **Treaties** - Treaty documents and artifacts
|
||||
- **Policies** - Legal policies and procedures
|
||||
- **Compliance** - Compliance documentation
|
||||
- **Attestations** - Legal attestations and certifications
|
||||
|
||||
## Note
|
||||
|
||||
This directory contains legal documents and should be treated with appropriate security and access controls.
|
||||
|
||||
27
docs/product/README.md
Normal file
27
docs/product/README.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Product Documentation
|
||||
|
||||
Product documentation, roadmaps, and PRDs for The Order.
|
||||
|
||||
## Contents
|
||||
|
||||
- **Roadmaps** - Product roadmaps and feature planning
|
||||
- **PRDs** - Product Requirements Documents
|
||||
- **User Guides** - End-user documentation
|
||||
- **API Documentation** - API reference and guides
|
||||
|
||||
## Roadmaps
|
||||
|
||||
See `roadmaps/` directory for product roadmaps.
|
||||
|
||||
## PRDs
|
||||
|
||||
See `prds/` directory for Product Requirements Documents.
|
||||
|
||||
## User Guides
|
||||
|
||||
See `user-guides/` directory for end-user documentation.
|
||||
|
||||
## API Documentation
|
||||
|
||||
See `api/` directory for API documentation and reference.
|
||||
|
||||
58
infra/README.md
Normal file
58
infra/README.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Infrastructure
|
||||
|
||||
Infrastructure as code for The Order.
|
||||
|
||||
## Directory Structure
|
||||
|
||||
- `terraform/` - Terraform configurations
|
||||
- `k8s/` - Kubernetes manifests and Helm charts
|
||||
- `gateways/` - API gateway and proxy configurations
|
||||
- `cicd/` - CI/CD templates and scripts
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. **Terraform**: Set up cloud infrastructure
|
||||
```bash
|
||||
cd terraform
|
||||
terraform init
|
||||
terraform plan
|
||||
terraform apply
|
||||
```
|
||||
|
||||
2. **Kubernetes**: Deploy applications
|
||||
```bash
|
||||
cd k8s
|
||||
kubectl apply -k overlays/dev
|
||||
```
|
||||
|
||||
3. **Gateway**: Configure API gateway
|
||||
```bash
|
||||
cd gateways
|
||||
# Apply gateway configuration
|
||||
```
|
||||
|
||||
## Environments
|
||||
|
||||
- **Development**: Local development environment
|
||||
- **Staging**: Pre-production environment
|
||||
- **Production**: Live production environment
|
||||
|
||||
## Security
|
||||
|
||||
- Secrets management via SOPS and KMS
|
||||
- Network policies and security groups
|
||||
- WAF rules for API protection
|
||||
- TLS/SSL certificates
|
||||
- Regular security audits
|
||||
|
||||
## Monitoring
|
||||
|
||||
- Prometheus for metrics
|
||||
- Grafana for dashboards
|
||||
- OpenTelemetry for tracing
|
||||
- ELK/OpenSearch for logging
|
||||
|
||||
## Documentation
|
||||
|
||||
See individual README files in each subdirectory for more details.
|
||||
|
||||
42
infra/cicd/README.md
Normal file
42
infra/cicd/README.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# CI/CD Templates and Configuration
|
||||
|
||||
Reusable CI/CD templates and configuration for The Order.
|
||||
|
||||
## Structure
|
||||
|
||||
- `templates/` - Reusable CI/CD templates
|
||||
- `scripts/` - CI/CD helper scripts
|
||||
- `config/` - CI/CD configuration files
|
||||
|
||||
## Templates
|
||||
|
||||
- `ci-template.yml` - Base CI template
|
||||
- `deploy-template.yml` - Deployment template
|
||||
- `release-template.yml` - Release template
|
||||
|
||||
## Features
|
||||
|
||||
- Automated testing
|
||||
- Security scanning (Trivy, Grype)
|
||||
- SBOM generation (Syft)
|
||||
- Image signing (Cosign)
|
||||
- Deployment automation
|
||||
- Release automation
|
||||
|
||||
## Usage
|
||||
|
||||
Copy templates to `.github/workflows/` and customize for your needs.
|
||||
|
||||
## Security
|
||||
|
||||
- All images are signed with Cosign
|
||||
- SBOMs are generated for all artifacts
|
||||
- Vulnerability scanning on every build
|
||||
- Secrets are managed via GitHub Secrets or External Secrets
|
||||
|
||||
## Deployment
|
||||
|
||||
- Development: Automatic deployment on push to `develop`
|
||||
- Staging: Automatic deployment on push to `main`
|
||||
- Production: Manual approval required for deployment
|
||||
|
||||
87
infra/cicd/templates/ci-template.yml
Normal file
87
infra/cicd/templates/ci-template.yml
Normal file
@@ -0,0 +1,87 @@
|
||||
# CI/CD Template
|
||||
# This is a reusable template for CI/CD pipelines
|
||||
|
||||
name: CI Template
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, develop]
|
||||
pull_request:
|
||||
branches: [main, develop]
|
||||
|
||||
jobs:
|
||||
build-and-test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v2
|
||||
with:
|
||||
version: 8
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
cache: 'pnpm'
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Lint
|
||||
run: pnpm lint
|
||||
|
||||
- name: Type check
|
||||
run: pnpm type-check
|
||||
|
||||
- name: Test
|
||||
run: pnpm test
|
||||
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
|
||||
security-scan:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Run Trivy vulnerability scanner
|
||||
uses: aquasecurity/trivy-action@master
|
||||
with:
|
||||
scan-type: 'fs'
|
||||
scan-ref: '.'
|
||||
format: 'sarif'
|
||||
output: 'trivy-results.sarif'
|
||||
|
||||
- name: Upload Trivy results to GitHub Security
|
||||
uses: github/codeql-action/upload-sarif@v2
|
||||
with:
|
||||
sarif_file: 'trivy-results.sarif'
|
||||
|
||||
sbom:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Syft
|
||||
uses: anchore/sbom-action/download-syft@v0
|
||||
with:
|
||||
syft-version: latest
|
||||
|
||||
- name: Generate SBOM
|
||||
run: |
|
||||
syft packages dir:. -o spdx-json > sbom.spdx.json
|
||||
syft packages dir:. -o cyclonedx-json > sbom.cyclonedx.json
|
||||
|
||||
- name: Upload SBOM artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: sbom
|
||||
path: |
|
||||
sbom.spdx.json
|
||||
sbom.cyclonedx.json
|
||||
|
||||
45
infra/gateways/README.md
Normal file
45
infra/gateways/README.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# API Gateway Configuration
|
||||
|
||||
Configuration for API gateway, proxy, and WAF.
|
||||
|
||||
## Components
|
||||
|
||||
- **NGINX** - Reverse proxy and load balancer
|
||||
- **API Gateway** - Cloud provider API gateway (AWS API Gateway, GCP API Gateway, etc.)
|
||||
- **WAF** - Web Application Firewall rules
|
||||
|
||||
## Configuration Files
|
||||
|
||||
- `nginx.conf` - NGINX configuration
|
||||
- `api-gateway.yaml` - API Gateway configuration (cloud-specific)
|
||||
- `waf-rules.yaml` - WAF rules configuration
|
||||
|
||||
## Features
|
||||
|
||||
- Rate limiting
|
||||
- Request routing
|
||||
- SSL/TLS termination
|
||||
- Authentication/Authorization
|
||||
- Request/Response transformation
|
||||
- Logging and monitoring
|
||||
|
||||
## Policies
|
||||
|
||||
- OPA (Open Policy Agent) policies in `policies/` directory
|
||||
- Rate limiting policies
|
||||
- Access control policies
|
||||
- Data validation policies
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
# Deploy NGINX configuration
|
||||
kubectl apply -f nginx-configmap.yaml
|
||||
|
||||
# Update API Gateway
|
||||
# (Cloud provider specific commands)
|
||||
|
||||
# Apply WAF rules
|
||||
# (Cloud provider specific commands)
|
||||
```
|
||||
|
||||
74
infra/gateways/nginx.conf
Normal file
74
infra/gateways/nginx.conf
Normal file
@@ -0,0 +1,74 @@
|
||||
# NGINX configuration for API Gateway
|
||||
# This is a template - customize for your needs
|
||||
|
||||
upstream intake {
|
||||
server intake-service:4001;
|
||||
}
|
||||
|
||||
upstream identity {
|
||||
server identity-service:4002;
|
||||
}
|
||||
|
||||
upstream finance {
|
||||
server finance-service:4003;
|
||||
}
|
||||
|
||||
upstream dataroom {
|
||||
server dataroom-service:4004;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name api.the-order.local;
|
||||
|
||||
# Rate limiting
|
||||
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
|
||||
|
||||
# Intake service
|
||||
location /api/intake/ {
|
||||
limit_req zone=api_limit burst=20 nodelay;
|
||||
proxy_pass http://intake/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Identity service
|
||||
location /api/identity/ {
|
||||
limit_req zone=api_limit burst=20 nodelay;
|
||||
proxy_pass http://identity/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Finance service
|
||||
location /api/finance/ {
|
||||
limit_req zone=api_limit burst=20 nodelay;
|
||||
proxy_pass http://finance/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Dataroom service
|
||||
location /api/dataroom/ {
|
||||
limit_req zone=api_limit burst=20 nodelay;
|
||||
proxy_pass http://dataroom/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# Health check
|
||||
location /health {
|
||||
access_log off;
|
||||
return 200 "healthy\n";
|
||||
add_header Content-Type text/plain;
|
||||
}
|
||||
}
|
||||
|
||||
67
infra/k8s/README.md
Normal file
67
infra/k8s/README.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# Kubernetes Configuration
|
||||
|
||||
Kubernetes manifests and Helm charts for The Order.
|
||||
|
||||
## Structure
|
||||
|
||||
- `base/` - Base Kubernetes manifests
|
||||
- `overlays/` - Environment-specific overlays (dev, stage, prod)
|
||||
- `charts/` - Helm charts (if using Helm)
|
||||
|
||||
## Usage
|
||||
|
||||
### Using Kustomize
|
||||
|
||||
```bash
|
||||
# Build dev environment
|
||||
kubectl kustomize overlays/dev
|
||||
|
||||
# Apply dev environment
|
||||
kubectl apply -k overlays/dev
|
||||
|
||||
# Build prod environment
|
||||
kubectl kustomize overlays/prod
|
||||
|
||||
# Apply prod environment
|
||||
kubectl apply -k overlays/prod
|
||||
```
|
||||
|
||||
### Using Helm
|
||||
|
||||
```bash
|
||||
# Install chart
|
||||
helm install the-order charts/the-order -f charts/the-order/values-dev.yaml
|
||||
|
||||
# Upgrade chart
|
||||
helm upgrade the-order charts/the-order -f charts/the-order/values-prod.yaml
|
||||
```
|
||||
|
||||
## Namespaces
|
||||
|
||||
- `the-order-dev` - Development environment
|
||||
- `the-order-stage` - Staging environment
|
||||
- `the-order-prod` - Production environment
|
||||
|
||||
## Services
|
||||
|
||||
Each service has its own deployment, service, and ingress configuration:
|
||||
- Intake service
|
||||
- Identity service
|
||||
- Finance service
|
||||
- Dataroom service
|
||||
- Portal applications
|
||||
|
||||
## Secrets Management
|
||||
|
||||
Secrets are managed using:
|
||||
- External Secrets Operator
|
||||
- SOPS-encrypted secrets
|
||||
- Cloud provider secrets managers
|
||||
|
||||
## Monitoring
|
||||
|
||||
- Prometheus for metrics
|
||||
- Grafana for dashboards
|
||||
- OpenTelemetry for tracing
|
||||
- ELK/OpenSearch for logging
|
||||
|
||||
10
infra/k8s/base/configmap.yaml
Normal file
10
infra/k8s/base/configmap.yaml
Normal file
@@ -0,0 +1,10 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: the-order-config
|
||||
namespace: the-order
|
||||
data:
|
||||
# Add configuration data here
|
||||
LOG_LEVEL: "info"
|
||||
ENVIRONMENT: "base"
|
||||
|
||||
16
infra/k8s/base/kustomization.yaml
Normal file
16
infra/k8s/base/kustomization.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
namespace: the-order
|
||||
|
||||
resources:
|
||||
- namespace.yaml
|
||||
- configmap.yaml
|
||||
- secrets.yaml
|
||||
|
||||
# Add service-specific resources
|
||||
# - intake/
|
||||
# - identity/
|
||||
# - finance/
|
||||
# - dataroom/
|
||||
|
||||
8
infra/k8s/base/namespace.yaml
Normal file
8
infra/k8s/base/namespace.yaml
Normal file
@@ -0,0 +1,8 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: the-order
|
||||
labels:
|
||||
name: the-order
|
||||
environment: base
|
||||
|
||||
12
infra/k8s/base/secrets.yaml
Normal file
12
infra/k8s/base/secrets.yaml
Normal file
@@ -0,0 +1,12 @@
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: the-order-secrets
|
||||
namespace: the-order
|
||||
type: Opaque
|
||||
stringData:
|
||||
# Secrets should be managed via External Secrets Operator or SOPS
|
||||
# This is a template - do not commit actual secrets
|
||||
# DATABASE_URL: "postgresql://..."
|
||||
# API_KEY: "..."
|
||||
|
||||
21
infra/k8s/overlays/dev/kustomization.yaml
Normal file
21
infra/k8s/overlays/dev/kustomization.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
namespace: the-order-dev
|
||||
|
||||
resources:
|
||||
- ../../base
|
||||
|
||||
patches:
|
||||
- path: configmap-patch.yaml
|
||||
target:
|
||||
kind: ConfigMap
|
||||
name: the-order-config
|
||||
|
||||
configMapGenerator:
|
||||
- name: the-order-config
|
||||
behavior: merge
|
||||
literals:
|
||||
- ENVIRONMENT=dev
|
||||
- LOG_LEVEL=debug
|
||||
|
||||
31
infra/k8s/overlays/prod/kustomization.yaml
Normal file
31
infra/k8s/overlays/prod/kustomization.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
|
||||
namespace: the-order-prod
|
||||
|
||||
resources:
|
||||
- ../../base
|
||||
|
||||
patches:
|
||||
- path: configmap-patch.yaml
|
||||
target:
|
||||
kind: ConfigMap
|
||||
name: the-order-config
|
||||
|
||||
configMapGenerator:
|
||||
- name: the-order-config
|
||||
behavior: merge
|
||||
literals:
|
||||
- ENVIRONMENT=prod
|
||||
- LOG_LEVEL=info
|
||||
|
||||
replicas:
|
||||
- name: intake
|
||||
count: 3
|
||||
- name: identity
|
||||
count: 3
|
||||
- name: finance
|
||||
count: 2
|
||||
- name: dataroom
|
||||
count: 2
|
||||
|
||||
49
infra/terraform/README.md
Normal file
49
infra/terraform/README.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# Terraform Infrastructure
|
||||
|
||||
Terraform configuration for The Order infrastructure.
|
||||
|
||||
## Structure
|
||||
|
||||
- `main.tf` - Main Terraform configuration
|
||||
- `variables.tf` - Variable definitions
|
||||
- `outputs.tf` - Output definitions
|
||||
- `modules/` - Reusable Terraform modules
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
# Initialize Terraform
|
||||
terraform init
|
||||
|
||||
# Plan changes
|
||||
terraform plan
|
||||
|
||||
# Apply changes
|
||||
terraform apply
|
||||
|
||||
# Destroy infrastructure
|
||||
terraform destroy
|
||||
```
|
||||
|
||||
## Environments
|
||||
|
||||
- `dev/` - Development environment
|
||||
- `stage/` - Staging environment
|
||||
- `prod/` - Production environment
|
||||
|
||||
## Resources
|
||||
|
||||
- Kubernetes cluster
|
||||
- Database (PostgreSQL)
|
||||
- Object storage (S3/GCS)
|
||||
- KMS/HSM for key management
|
||||
- Load balancers
|
||||
- Network configuration
|
||||
|
||||
## Secrets Management
|
||||
|
||||
Secrets are managed using:
|
||||
- SOPS for encrypted secrets
|
||||
- Cloud KMS for key management
|
||||
- External Secrets Operator for Kubernetes
|
||||
|
||||
46
infra/terraform/main.tf
Normal file
46
infra/terraform/main.tf
Normal file
@@ -0,0 +1,46 @@
|
||||
# Terraform configuration for The Order infrastructure
|
||||
# This is a template - customize for your cloud provider
|
||||
|
||||
terraform {
|
||||
required_version = ">= 1.5.0"
|
||||
|
||||
required_providers {
|
||||
# Add your cloud provider(s) here
|
||||
# Example for AWS:
|
||||
# aws = {
|
||||
# source = "hashicorp/aws"
|
||||
# version = "~> 5.0"
|
||||
# }
|
||||
}
|
||||
|
||||
# Configure backend for state management
|
||||
# backend "s3" {
|
||||
# bucket = "the-order-terraform-state"
|
||||
# key = "terraform.tfstate"
|
||||
# region = "us-east-1"
|
||||
# }
|
||||
}
|
||||
|
||||
# Provider configuration
|
||||
# provider "aws" {
|
||||
# region = var.aws_region
|
||||
# }
|
||||
|
||||
# Variables
|
||||
variable "aws_region" {
|
||||
description = "AWS region"
|
||||
type = string
|
||||
default = "us-east-1"
|
||||
}
|
||||
|
||||
variable "environment" {
|
||||
description = "Environment name (dev, stage, prod)"
|
||||
type = string
|
||||
default = "dev"
|
||||
}
|
||||
|
||||
# Outputs
|
||||
output "environment" {
|
||||
value = var.environment
|
||||
}
|
||||
|
||||
24
infra/terraform/outputs.tf
Normal file
24
infra/terraform/outputs.tf
Normal file
@@ -0,0 +1,24 @@
|
||||
# Terraform outputs for The Order infrastructure
|
||||
|
||||
output "environment" {
|
||||
description = "Environment name"
|
||||
value = var.environment
|
||||
}
|
||||
|
||||
output "project_name" {
|
||||
description = "Project name"
|
||||
value = var.project_name
|
||||
}
|
||||
|
||||
# Add more outputs as needed
|
||||
# Example:
|
||||
# output "kubernetes_cluster_endpoint" {
|
||||
# description = "Kubernetes cluster endpoint"
|
||||
# value = module.kubernetes.cluster_endpoint
|
||||
# }
|
||||
|
||||
# output "database_endpoint" {
|
||||
# description = "Database endpoint"
|
||||
# value = module.database.endpoint
|
||||
# }
|
||||
|
||||
41
infra/terraform/variables.tf
Normal file
41
infra/terraform/variables.tf
Normal file
@@ -0,0 +1,41 @@
|
||||
# Terraform variables for The Order infrastructure
|
||||
|
||||
variable "environment" {
|
||||
description = "Environment name (dev, stage, prod)"
|
||||
type = string
|
||||
validation {
|
||||
condition = contains(["dev", "stage", "prod"], var.environment)
|
||||
error_message = "Environment must be dev, stage, or prod."
|
||||
}
|
||||
}
|
||||
|
||||
variable "aws_region" {
|
||||
description = "AWS region"
|
||||
type = string
|
||||
default = "us-east-1"
|
||||
}
|
||||
|
||||
variable "project_name" {
|
||||
description = "Project name"
|
||||
type = string
|
||||
default = "the-order"
|
||||
}
|
||||
|
||||
variable "domain_name" {
|
||||
description = "Domain name for the application"
|
||||
type = string
|
||||
default = ""
|
||||
}
|
||||
|
||||
variable "enable_monitoring" {
|
||||
description = "Enable monitoring and observability"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
variable "enable_logging" {
|
||||
description = "Enable centralized logging"
|
||||
type = bool
|
||||
default = true
|
||||
}
|
||||
|
||||
35
package.json
Normal file
35
package.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "the-order-monorepo",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "The Order - Monorepo for all applications, services, and packages",
|
||||
"scripts": {
|
||||
"build": "turbo run build",
|
||||
"dev": "turbo run dev",
|
||||
"lint": "turbo run lint",
|
||||
"type-check": "turbo run type-check",
|
||||
"test": "turbo run test",
|
||||
"clean": "turbo run clean && rm -rf node_modules",
|
||||
"format": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md,yaml,yml}\"",
|
||||
"format:check": "prettier --check \"**/*.{ts,tsx,js,jsx,json,md,yaml,yml}\"",
|
||||
"prepare": "husky install || true"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@turbo/gen": "^1.11.0",
|
||||
"prettier": "^3.1.1",
|
||||
"turbo": "^1.11.0",
|
||||
"typescript": "^5.3.3",
|
||||
"husky": "^8.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0",
|
||||
"pnpm": ">=8.0.0"
|
||||
},
|
||||
"packageManager": "pnpm@8.15.0",
|
||||
"workspaces": [
|
||||
"apps/*",
|
||||
"services/*",
|
||||
"packages/*"
|
||||
]
|
||||
}
|
||||
|
||||
20
packages/auth/README.md
Normal file
20
packages/auth/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# @the-order/auth
|
||||
|
||||
Authentication and authorization helpers for The Order.
|
||||
|
||||
## Features
|
||||
|
||||
- OIDC/OAuth2 support
|
||||
- DID (Decentralized Identifier) support
|
||||
- eIDAS integration
|
||||
|
||||
## Usage
|
||||
|
||||
```typescript
|
||||
import { OIDCProvider, DIDResolver, EIDASProvider } from '@the-order/auth';
|
||||
|
||||
const oidc = new OIDCProvider(config);
|
||||
const didResolver = new DIDResolver();
|
||||
const eidas = new EIDASProvider(config);
|
||||
```
|
||||
|
||||
23
packages/auth/package.json
Normal file
23
packages/auth/package.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "@the-order/auth",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "Authentication and authorization helpers for The Order",
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"dev": "tsc --watch",
|
||||
"lint": "eslint src --ext .ts",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"jsonwebtoken": "^9.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jsonwebtoken": "^9.0.5",
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
||||
|
||||
34
packages/auth/src/did.ts
Normal file
34
packages/auth/src/did.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* DID (Decentralized Identifier) helpers
|
||||
*/
|
||||
|
||||
export interface DIDDocument {
|
||||
id: string;
|
||||
'@context': string[];
|
||||
verificationMethod: VerificationMethod[];
|
||||
authentication: string[];
|
||||
}
|
||||
|
||||
export interface VerificationMethod {
|
||||
id: string;
|
||||
type: string;
|
||||
controller: string;
|
||||
publicKeyMultibase?: string;
|
||||
}
|
||||
|
||||
export class DIDResolver {
|
||||
async resolve(did: string): Promise<DIDDocument> {
|
||||
// Implementation for DID resolution
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async verifySignature(
|
||||
did: string,
|
||||
message: string,
|
||||
signature: string
|
||||
): Promise<boolean> {
|
||||
// Implementation for signature verification
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
29
packages/auth/src/eidas.ts
Normal file
29
packages/auth/src/eidas.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
/**
|
||||
* eIDAS (electronic IDentification, Authentication and trust Services) helpers
|
||||
*/
|
||||
|
||||
export interface EIDASConfig {
|
||||
providerUrl: string;
|
||||
apiKey: string;
|
||||
}
|
||||
|
||||
export interface EIDASSignature {
|
||||
signature: string;
|
||||
certificate: string;
|
||||
timestamp: Date;
|
||||
}
|
||||
|
||||
export class EIDASProvider {
|
||||
constructor(private config: EIDASConfig) {}
|
||||
|
||||
async requestSignature(document: string): Promise<EIDASSignature> {
|
||||
// Implementation for eIDAS signature request
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async verifySignature(signature: EIDASSignature): Promise<boolean> {
|
||||
// Implementation for eIDAS signature verification
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
8
packages/auth/src/index.ts
Normal file
8
packages/auth/src/index.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* The Order Auth Package
|
||||
*/
|
||||
|
||||
export * from './oidc';
|
||||
export * from './did';
|
||||
export * from './eidas';
|
||||
|
||||
31
packages/auth/src/oidc.ts
Normal file
31
packages/auth/src/oidc.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* OIDC/OAuth2 helpers
|
||||
*/
|
||||
|
||||
export interface OIDCConfig {
|
||||
issuer: string;
|
||||
clientId: string;
|
||||
clientSecret: string;
|
||||
redirectUri: string;
|
||||
}
|
||||
|
||||
export class OIDCProvider {
|
||||
constructor(private config: OIDCConfig) {}
|
||||
|
||||
async getAuthorizationUrl(state: string): Promise<string> {
|
||||
const params = new URLSearchParams({
|
||||
client_id: this.config.clientId,
|
||||
redirect_uri: this.config.redirectUri,
|
||||
response_type: 'code',
|
||||
scope: 'openid profile email',
|
||||
state,
|
||||
});
|
||||
return `${this.config.issuer}/authorize?${params.toString()}`;
|
||||
}
|
||||
|
||||
async exchangeCodeForToken(code: string): Promise<string> {
|
||||
// Implementation for token exchange
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
10
packages/auth/tsconfig.json
Normal file
10
packages/auth/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
22
packages/crypto/README.md
Normal file
22
packages/crypto/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# @the-order/crypto
|
||||
|
||||
KMS/HSM client, key management, and signatures for eIDAS/DID.
|
||||
|
||||
## Usage
|
||||
|
||||
```typescript
|
||||
import { KMSClient, SignatureService } from '@the-order/crypto';
|
||||
|
||||
const kms = new KMSClient(config);
|
||||
const signatureService = new SignatureService(kms);
|
||||
|
||||
const signature = await signatureService.sign(data, options);
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
- KMS/HSM integration
|
||||
- Key management
|
||||
- Digital signatures
|
||||
- eIDAS/DID support
|
||||
|
||||
22
packages/crypto/package.json
Normal file
22
packages/crypto/package.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "@the-order/crypto",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "KMS/HSM client, key management, and signatures for eIDAS/DID",
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"dev": "tsc --watch",
|
||||
"lint": "eslint src --ext .ts",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-kms": "^3.490.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
||||
|
||||
7
packages/crypto/src/index.ts
Normal file
7
packages/crypto/src/index.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
/**
|
||||
* The Order Crypto Package
|
||||
*/
|
||||
|
||||
export * from './kms';
|
||||
export * from './signature';
|
||||
|
||||
34
packages/crypto/src/kms.ts
Normal file
34
packages/crypto/src/kms.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* KMS/HSM client for key management
|
||||
*/
|
||||
|
||||
export interface KMSConfig {
|
||||
provider: 'aws' | 'gcp' | 'azure' | 'hsm';
|
||||
keyId: string;
|
||||
region?: string;
|
||||
}
|
||||
|
||||
export class KMSClient {
|
||||
constructor(private config: KMSConfig) {}
|
||||
|
||||
async encrypt(plaintext: Buffer): Promise<Buffer> {
|
||||
// Implementation for encryption
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async decrypt(ciphertext: Buffer): Promise<Buffer> {
|
||||
// Implementation for decryption
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async sign(data: Buffer): Promise<Buffer> {
|
||||
// Implementation for signing
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async verify(data: Buffer, signature: Buffer): Promise<boolean> {
|
||||
// Implementation for signature verification
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
33
packages/crypto/src/signature.ts
Normal file
33
packages/crypto/src/signature.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* Signature utilities for eIDAS/DID
|
||||
*/
|
||||
|
||||
import { KMSClient } from './kms';
|
||||
|
||||
export interface SignatureOptions {
|
||||
algorithm: 'RS256' | 'ES256' | 'EdDSA';
|
||||
keyId: string;
|
||||
}
|
||||
|
||||
export class SignatureService {
|
||||
constructor(private kms: KMSClient) {}
|
||||
|
||||
async sign(data: Buffer, options: SignatureOptions): Promise<Buffer> {
|
||||
return this.kms.sign(data);
|
||||
}
|
||||
|
||||
async verify(
|
||||
data: Buffer,
|
||||
signature: Buffer,
|
||||
options: SignatureOptions
|
||||
): Promise<boolean> {
|
||||
return this.kms.verify(data, signature);
|
||||
}
|
||||
|
||||
async signJSON(data: unknown, options: SignatureOptions): Promise<string> {
|
||||
const jsonString = JSON.stringify(data);
|
||||
const signature = await this.sign(Buffer.from(jsonString), options);
|
||||
return signature.toString('base64');
|
||||
}
|
||||
}
|
||||
|
||||
10
packages/crypto/tsconfig.json
Normal file
10
packages/crypto/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
25
packages/schemas/README.md
Normal file
25
packages/schemas/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# @the-order/schemas
|
||||
|
||||
Shared schemas and contracts for The Order using Zod.
|
||||
|
||||
## Usage
|
||||
|
||||
```typescript
|
||||
import { UserSchema, DocumentSchema } from '@the-order/schemas';
|
||||
|
||||
const user = UserSchema.parse(userData);
|
||||
const document = DocumentSchema.parse(documentData);
|
||||
```
|
||||
|
||||
## Available Schemas
|
||||
|
||||
- `UserSchema` - User entity schema
|
||||
- `DocumentSchema` - Document entity schema
|
||||
- `DealSchema` - Deal entity schema
|
||||
|
||||
## OpenAPI Generation
|
||||
|
||||
```bash
|
||||
pnpm generate:openapi
|
||||
```
|
||||
|
||||
24
packages/schemas/package.json
Normal file
24
packages/schemas/package.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "@the-order/schemas",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "Shared schemas and contracts for The Order",
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"dev": "tsc --watch",
|
||||
"lint": "eslint src --ext .ts",
|
||||
"type-check": "tsc --noEmit",
|
||||
"generate:openapi": "ts-node scripts/generate-openapi.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"zod": "^3.22.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3",
|
||||
"zod-to-openapi": "^0.2.1"
|
||||
}
|
||||
}
|
||||
|
||||
23
packages/schemas/src/deal.ts
Normal file
23
packages/schemas/src/deal.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const DealStatusSchema = z.enum(['draft', 'active', 'closed', 'archived']);
|
||||
|
||||
export const DealSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
name: z.string().min(1),
|
||||
status: DealStatusSchema,
|
||||
dataroomId: z.string().uuid().optional(),
|
||||
createdAt: z.date().or(z.string().datetime()),
|
||||
updatedAt: z.date().or(z.string().datetime()),
|
||||
});
|
||||
|
||||
export type Deal = z.infer<typeof DealSchema>;
|
||||
|
||||
export const CreateDealSchema = DealSchema.omit({
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
});
|
||||
|
||||
export type CreateDeal = z.infer<typeof CreateDealSchema>;
|
||||
|
||||
24
packages/schemas/src/document.ts
Normal file
24
packages/schemas/src/document.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const DocumentTypeSchema = z.enum(['legal', 'treaty', 'finance', 'history']);
|
||||
|
||||
export const DocumentSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
title: z.string().min(1),
|
||||
type: DocumentTypeSchema,
|
||||
content: z.string().optional(),
|
||||
fileUrl: z.string().url().optional(),
|
||||
createdAt: z.date().or(z.string().datetime()),
|
||||
updatedAt: z.date().or(z.string().datetime()),
|
||||
});
|
||||
|
||||
export type Document = z.infer<typeof DocumentSchema>;
|
||||
|
||||
export const CreateDocumentSchema = DocumentSchema.omit({
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
});
|
||||
|
||||
export type CreateDocument = z.infer<typeof CreateDocumentSchema>;
|
||||
|
||||
8
packages/schemas/src/index.ts
Normal file
8
packages/schemas/src/index.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* The Order Schemas
|
||||
*/
|
||||
|
||||
export * from './user';
|
||||
export * from './document';
|
||||
export * from './deal';
|
||||
|
||||
20
packages/schemas/src/user.ts
Normal file
20
packages/schemas/src/user.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { z } from 'zod';
|
||||
|
||||
export const UserSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
email: z.string().email(),
|
||||
name: z.string().min(1),
|
||||
createdAt: z.date().or(z.string().datetime()),
|
||||
updatedAt: z.date().or(z.string().datetime()),
|
||||
});
|
||||
|
||||
export type User = z.infer<typeof UserSchema>;
|
||||
|
||||
export const CreateUserSchema = UserSchema.omit({
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
});
|
||||
|
||||
export type CreateUser = z.infer<typeof CreateUserSchema>;
|
||||
|
||||
10
packages/schemas/tsconfig.json
Normal file
10
packages/schemas/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
22
packages/storage/README.md
Normal file
22
packages/storage/README.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# @the-order/storage
|
||||
|
||||
Storage abstraction for S3/GCS with WORM mode support.
|
||||
|
||||
## Usage
|
||||
|
||||
```typescript
|
||||
import { StorageClient, WORMStorage } from '@the-order/storage';
|
||||
|
||||
const storage = new StorageClient(config);
|
||||
const wormStorage = new WORMStorage(config);
|
||||
|
||||
await storage.upload({ key: 'file.txt', content: 'Hello' });
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
- S3 and GCS support
|
||||
- WORM (Write Once Read Many) mode
|
||||
- Presigned URL generation
|
||||
- Object lifecycle management
|
||||
|
||||
22
packages/storage/package.json
Normal file
22
packages/storage/package.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "@the-order/storage",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "Storage abstraction for S3/GCS with WORM mode support",
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"dev": "tsc --watch",
|
||||
"lint": "eslint src --ext .ts",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.490.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
||||
|
||||
7
packages/storage/src/index.ts
Normal file
7
packages/storage/src/index.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
/**
|
||||
* The Order Storage Package
|
||||
*/
|
||||
|
||||
export * from './storage';
|
||||
export * from './worm';
|
||||
|
||||
43
packages/storage/src/storage.ts
Normal file
43
packages/storage/src/storage.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Storage abstraction for S3/GCS
|
||||
*/
|
||||
|
||||
export interface StorageConfig {
|
||||
provider: 's3' | 'gcs';
|
||||
bucket: string;
|
||||
region?: string;
|
||||
accessKeyId?: string;
|
||||
secretAccessKey?: string;
|
||||
}
|
||||
|
||||
export interface StorageObject {
|
||||
key: string;
|
||||
content: Buffer | string;
|
||||
contentType?: string;
|
||||
metadata?: Record<string, string>;
|
||||
}
|
||||
|
||||
export class StorageClient {
|
||||
constructor(private config: StorageConfig) {}
|
||||
|
||||
async upload(object: StorageObject): Promise<string> {
|
||||
// Implementation for file upload
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async download(key: string): Promise<Buffer> {
|
||||
// Implementation for file download
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async delete(key: string): Promise<void> {
|
||||
// Implementation for file deletion
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
|
||||
async getPresignedUrl(key: string, expiresIn: number): Promise<string> {
|
||||
// Implementation for presigned URL generation
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
26
packages/storage/src/worm.ts
Normal file
26
packages/storage/src/worm.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
/**
|
||||
* WORM (Write Once Read Many) mode storage
|
||||
*/
|
||||
|
||||
import { StorageClient, StorageObject } from './storage';
|
||||
|
||||
export class WORMStorage extends StorageClient {
|
||||
async upload(object: StorageObject): Promise<string> {
|
||||
// WORM mode: prevent overwrites
|
||||
const exists = await this.objectExists(object.key);
|
||||
if (exists) {
|
||||
throw new Error(`Object ${object.key} already exists in WORM storage`);
|
||||
}
|
||||
return super.upload(object);
|
||||
}
|
||||
|
||||
async delete(key: string): Promise<void> {
|
||||
throw new Error('Deletion not allowed in WORM mode');
|
||||
}
|
||||
|
||||
private async objectExists(key: string): Promise<boolean> {
|
||||
// Implementation to check if object exists
|
||||
throw new Error('Not implemented');
|
||||
}
|
||||
}
|
||||
|
||||
10
packages/storage/tsconfig.json
Normal file
10
packages/storage/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
21
packages/test-utils/README.md
Normal file
21
packages/test-utils/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# @the-order/test-utils
|
||||
|
||||
Shared testing utilities for The Order monorepo.
|
||||
|
||||
## Usage
|
||||
|
||||
```typescript
|
||||
import { createTestUser, createTestDocument, sleep } from '@the-order/test-utils';
|
||||
|
||||
const user = createTestUser({ email: 'custom@example.com' });
|
||||
const doc = createTestDocument({ title: 'My Document' });
|
||||
await sleep(1000);
|
||||
```
|
||||
|
||||
## Available Utilities
|
||||
|
||||
- `createTestUser()` - Create a test user object
|
||||
- `createTestDocument()` - Create a test document object
|
||||
- `sleep()` - Wait for a specified number of milliseconds
|
||||
- `createMockResponse()` - Create a mock fetch response
|
||||
|
||||
22
packages/test-utils/package.json
Normal file
22
packages/test-utils/package.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "@the-order/test-utils",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "Shared testing utilities for The Order",
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"test": "vitest run",
|
||||
"test:watch": "vitest",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vitest/ui": "^1.1.0",
|
||||
"vitest": "^1.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
||||
|
||||
62
packages/test-utils/src/index.ts
Normal file
62
packages/test-utils/src/index.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* Test utilities for The Order
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a test user object
|
||||
*/
|
||||
export function createTestUser(overrides?: Partial<TestUser>): TestUser {
|
||||
return {
|
||||
id: 'test-user-id',
|
||||
email: 'test@example.com',
|
||||
name: 'Test User',
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a test document object
|
||||
*/
|
||||
export function createTestDocument(overrides?: Partial<TestDocument>): TestDocument {
|
||||
return {
|
||||
id: 'test-doc-id',
|
||||
title: 'Test Document',
|
||||
type: 'legal',
|
||||
content: 'Test content',
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for a specified number of milliseconds
|
||||
*/
|
||||
export function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mock fetch response
|
||||
*/
|
||||
export function createMockResponse(data: unknown, status = 200): Response {
|
||||
return new Response(JSON.stringify(data), {
|
||||
status,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
// Types
|
||||
export interface TestUser {
|
||||
id: string;
|
||||
email: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export interface TestDocument {
|
||||
id: string;
|
||||
title: string;
|
||||
type: string;
|
||||
content: string;
|
||||
}
|
||||
|
||||
10
packages/test-utils/tsconfig.json
Normal file
10
packages/test-utils/tsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.spec.ts"]
|
||||
}
|
||||
|
||||
28
packages/ui/README.md
Normal file
28
packages/ui/README.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# @the-order/ui
|
||||
|
||||
Design system and UI components for The Order.
|
||||
|
||||
## Usage
|
||||
|
||||
```tsx
|
||||
import { Button } from '@the-order/ui';
|
||||
|
||||
function MyComponent() {
|
||||
return <Button variant="primary">Click me</Button>;
|
||||
}
|
||||
```
|
||||
|
||||
## Components
|
||||
|
||||
- `Button` - Button component with variants
|
||||
|
||||
## Development
|
||||
|
||||
```bash
|
||||
# Build
|
||||
pnpm build
|
||||
|
||||
# Watch mode
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
28
packages/ui/package.json
Normal file
28
packages/ui/package.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"name": "@the-order/ui",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "Design system and UI components for The Order",
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"dev": "tsc --watch",
|
||||
"lint": "eslint src --ext .ts,.tsx",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^18.2.45",
|
||||
"@types/react-dom": "^18.2.18",
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
36
packages/ui/src/components/Button.tsx
Normal file
36
packages/ui/src/components/Button.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
import React from 'react';
|
||||
|
||||
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
||||
variant?: 'primary' | 'secondary' | 'outline';
|
||||
size?: 'sm' | 'md' | 'lg';
|
||||
}
|
||||
|
||||
export const Button: React.FC<ButtonProps> = ({
|
||||
variant = 'primary',
|
||||
size = 'md',
|
||||
children,
|
||||
className = '',
|
||||
...props
|
||||
}) => {
|
||||
const baseClasses = 'font-medium rounded-lg transition-colors';
|
||||
const variantClasses = {
|
||||
primary: 'bg-blue-600 text-white hover:bg-blue-700',
|
||||
secondary: 'bg-gray-600 text-white hover:bg-gray-700',
|
||||
outline: 'border border-gray-300 text-gray-700 hover:bg-gray-50',
|
||||
};
|
||||
const sizeClasses = {
|
||||
sm: 'px-3 py-1.5 text-sm',
|
||||
md: 'px-4 py-2 text-base',
|
||||
lg: 'px-6 py-3 text-lg',
|
||||
};
|
||||
|
||||
return (
|
||||
<button
|
||||
className={`${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]} ${className}`}
|
||||
{...props}
|
||||
>
|
||||
{children}
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
7
packages/ui/src/components/index.ts
Normal file
7
packages/ui/src/components/index.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
/**
|
||||
* UI Components
|
||||
*/
|
||||
|
||||
// Export components here as they are created
|
||||
export { Button } from './Button';
|
||||
|
||||
6
packages/ui/src/index.ts
Normal file
6
packages/ui/src/index.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
/**
|
||||
* The Order UI Component Library
|
||||
*/
|
||||
|
||||
export * from './components';
|
||||
|
||||
11
packages/ui/tsconfig.json
Normal file
11
packages/ui/tsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "./dist",
|
||||
"rootDir": "./src",
|
||||
"jsx": "react-jsx"
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.test.tsx", "**/*.spec.ts", "**/*.spec.tsx"]
|
||||
}
|
||||
|
||||
21
packages/workflows/README.md
Normal file
21
packages/workflows/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# @the-order/workflows
|
||||
|
||||
Temporal/Step Functions workflow definitions for The Order.
|
||||
|
||||
## Usage
|
||||
|
||||
```typescript
|
||||
import { intakeWorkflow, reviewWorkflow } from '@the-order/workflows';
|
||||
|
||||
const result = await intakeWorkflow({
|
||||
documentId: 'doc-123',
|
||||
fileUrl: 'https://...',
|
||||
userId: 'user-123',
|
||||
});
|
||||
```
|
||||
|
||||
## Workflows
|
||||
|
||||
- `intakeWorkflow` - Document intake and processing
|
||||
- `reviewWorkflow` - Document review and approval
|
||||
|
||||
22
packages/workflows/package.json
Normal file
22
packages/workflows/package.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "@the-order/workflows",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "Temporal/Step Functions workflow definitions",
|
||||
"main": "./src/index.ts",
|
||||
"types": "./src/index.ts",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"dev": "tsc --watch",
|
||||
"lint": "eslint src --ext .ts",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@temporalio/workflow": "^1.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20.10.6",
|
||||
"typescript": "^5.3.3"
|
||||
}
|
||||
}
|
||||
|
||||
7
packages/workflows/src/index.ts
Normal file
7
packages/workflows/src/index.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
/**
|
||||
* The Order Workflows Package
|
||||
*/
|
||||
|
||||
export * from './intake';
|
||||
export * from './review';
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user