forked from 0xWheatyz/SPARC
Add multi-tenant support with owner_id isolation #1696
Open
AI-Manager
wants to merge 2 commits from
feature/multi-tenant-isolation into main
pull from: feature/multi-tenant-isolation
merge into: leeworks-agents:main
leeworks-agents:main
leeworks-agents:feature/historical-analysis-diff
leeworks-agents:feature/1686-rate-limit-dashboard
leeworks-agents:feature/1684-cursor-pagination
leeworks-agents:feature/patent-classification-tags
leeworks-agents:feature/webhook-task-queue
leeworks-agents:feature/1674-batch-export-zip
leeworks-agents:feature/1685-stricter-company-name-validation
leeworks-agents:feature/api-key-auth
leeworks-agents:feature/1675-rate-limit-admin
leeworks-agents:feature/1669-cursor-pagination
leeworks-agents:feature/1670-company-name-validation
leeworks-agents:feature/1678-update-roadmap
leeworks-agents:feature/1656-tracked-company-admin-tests
leeworks-agents:feature/1661-analyze-single-patent-tests
leeworks-agents:feature/1660-s3-storage-tests
leeworks-agents:feature/1659-update-roadmap
leeworks-agents:feature/1658-scheduler-pooled-db
leeworks-agents:feature/1657-webhook-integration-tests
leeworks-agents:feature/1655-export-endpoint-tests
leeworks-agents:feature/1605-dark-mode
leeworks-agents:feature/1624-jwt-auth-tests
leeworks-agents:feature/1559-1560-enable-ci-linting-and-tests
leeworks-agents:feature/docs-patent-volume-mount
leeworks-agents:feature/1324-dark-mode-variants
leeworks-agents:feature/1013-multi-model
leeworks-agents:feature/426-generate-ts-api-client
leeworks-agents:feature/351-frontend-model-picker
leeworks-agents:feature/343-batch-loading-states
leeworks-agents:feature/env-example-updates
leeworks-agents:feature/260-tsc-ci
leeworks-agents:feature/export-pdf
leeworks-agents:feature/multi-model
leeworks-agents:feature/openapi-client-gen
leeworks-agents:feature/trend-charts
leeworks-agents:feature/compare-view
leeworks-agents:feature/s3-storage
leeworks-agents:feature/webhooks
leeworks-agents:feature/scheduled-analysis
leeworks-agents:feature/export-csv
leeworks-agents:feature/cursor-pagination
leeworks-agents:feature/dark-mode
leeworks-agents:feature/loading-error-states
leeworks-agents:feature/fix-single-patent-download
leeworks-agents:feature/structured-logging
leeworks-agents:feature/ci-tsc-lint
leeworks-agents:feature/ci-testing-linting
leeworks-agents:feature/db-client-pooling
leeworks-agents:feature/p2-config-improvements
leeworks-agents:feature/jwt-auth-tests
leeworks-agents:feature/persist-job-state
leeworks-agents:feature/p2-docs-and-lockfile
leeworks-agents:feature/rate-limiting
leeworks-agents:feature/p1-security-hardening
leeworks-agents:chore/add-roadmap
No Reviewers
Labels
Clear labels
P1
P2
P3
agent-ready
bug
bug-fix
ci
config
deploy-ready
deploy-ready
docs
feature
frontend
infra
large
medium
refactor
security
small
test
testing
Critical priority
Medium priority
Low priority
Ready for agent to work on
Something is not working correctly
Documentation improvement
New feature or enhancement
CI/CD, build, config, infrastructure
Large complexity (2+ hours)
Medium complexity (1-2 hours)
Code quality and refactoring
Security-related issue
Small complexity (< 1 hour)
Test coverage issues
No Label
Milestone
No items
No Milestone
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: leeworks-agents/SPARC#1696
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "feature/multi-tenant-isolation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
owner_id(FK tousers) column tollm_messages,jobs, andtracked_companiestablesowner_idso users cannot see or modify each other's data/admin/analyses,/admin/jobs) for cross-tenant access/trackedendpoints alongside existing admin endpointsscripts/migrate_add_owner_id.py) that backfillsowner_id = 1for existing rowstracked_companies.company_namewith per-owner unique index/analyze/batchvs/analyze/{company_name}Test plan
test_api,test_auth,test_tracked_companies,test_pagination,test_export,test_multi_tenant)Closes leeworks-agents/SPARC#1677
- Add owner_id (FK to users) column to llm_messages, jobs, and tracked_companies tables via schema migration in initialize_schema() - Filter all read/write operations by authenticated user's owner_id so users cannot see or modify each other's data - Add user-scoped /tracked endpoints alongside existing admin ones - Add admin-scoped /admin/analyses and /admin/jobs endpoints that return cross-tenant data without owner filtering - Create migration script (scripts/migrate_add_owner_id.py) that backfills owner_id=1 for all existing rows - Replace global UNIQUE on tracked_companies.company_name with per-owner unique index (company_name, owner_id) - Fix route ordering: /analyze/batch and /analyze/patent routes now registered before /analyze/{company_name} to prevent path conflicts - Update all existing API tests with proper auth headers and owner_id assertions - Add comprehensive cross-tenant isolation test suite (tests/test_multi_tenant.py) Closes leeworks-agents/SPARC#1677 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.