6.5 KiB
6.5 KiB
Partner Integration Architecture Summary
Overview
This document summarizes the simplified partner integration architecture that uses a dual-user approach with environment-based configuration, eliminating the complexity of separate partner management systems.
Architecture Benefits
1. Simplified User Management
- Partners as Users: Partner organizations are User entities with discriminator pattern
- Partner System Users: Customer accounts within partner systems, also as User entities
- Unified Auth: Leverage existing User authentication and authorization
- No Separate Models: No complex partner management UI or separate database collections
2. Environment-Based Configuration
- Partner Settings: API endpoints, credentials, timeouts via environment variables
- Easy Deployment: Configuration changes without code deployment
- Secure Credentials: Environment-based credential management
- Partner-Specific: Each partner can have different configuration
3. Customer Isolation
- Individual Accounts: Each customer has their own partner system account
- Separate Credentials: Customer-specific API keys and authentication
- Scalable: Easy to add new customers to partner systems
- Secure: Customer data isolation within partner systems
Data Model
User Entity with Discriminators
// Base User model with discriminator support
const User = mongoose.model('User', userSchema);
// Partner Organization (e.g., SatLoc company)
const Partner = User.discriminator('PARTNER', {
partnerCode: String, // 'SATLOC', 'AGIDRONEX'
partnerName: String, // 'SatLoc Cloud'
configuration: Mixed // Partner-specific settings
});
// Customer account in partner system
const PartnerSystemUser = User.discriminator('PARTNER_SYSTEM_USER', {
partner: ObjectId, // Reference to Partner
customer: ObjectId, // AgMission customer
partnerUserId: String, // Customer's ID in partner system
companyId: String, // Customer's company ID in partner system
apiKey: String, // Customer's API key
apiSecret: String // Customer's API secret
});
Job Assignment References
// JobAssign model references User directly
const JobAssign = mongoose.model('JobAssign', {
job: { type: Number, ref: 'Job' },
user: { type: Schema.Types.ObjectId, ref: 'User' }, // Can be Partner or PartnerSystemUser
status: { type: Number, enum: AssignStatus }
});
API Structure
Partner Management Endpoints
GET /api/partners # List partner organizations
POST /api/partners # Create partner organization
GET /api/partners/:id # Get partner details
PUT /api/partners/:id # Update partner
DELETE /api/partners/:id # Delete partner (soft delete)
GET /api/partners/systemUsers # List all partner system users
POST /api/partners/systemUsers # Create partner system user
GET /api/partners/systemUsers/:id # Get partner system user by ID
PUT /api/partners/systemUsers/:id # Update partner system user
DELETE /api/partners/systemUsers/:id # Delete partner system user (soft delete)
POST /api/partners/syncData # Sync data from partner system
POST /api/partners/uploadJob # Upload job to partner system
Job Assignment Flow
1. Create JobAssign with user: partnerSystemUserId
2. SatlocService.getCustomerCredentials(customerId) -> finds PartnerSystemUser
3. API calls use customer-specific credentials (companyId, apiKey, partnerUserId)
4. All operations are isolated to customer's partner account
Environment Configuration
Partner System Configuration
# Global Settings
PARTNER_SYNC_INTERVAL=300000
PARTNER_HEALTH_CHECK_INTERVAL=60000
PARTNER_MAX_CONCURRENT_JOBS=10
PARTNER_ENCRYPT_CREDENTIALS=true
# SatLoc Configuration
SATLOC_API_ENDPOINT=https://www.satloccloud.com/api/Satloc
SATLOC_API_KEY=default_api_key
SATLOC_API_SECRET=default_api_secret
SATLOC_API_TIMEOUT=30000
SATLOC_RETRY_ATTEMPTS=3
SATLOC_RATE_LIMIT=60
# AgIDronex Configuration
AGIDRONEX_API_ENDPOINT=https://api.agidronex.com/v1
AGIDRONEX_API_KEY=default_api_key
AGIDRONEX_API_SECRET=default_api_secret
AGIDRONEX_API_TIMEOUT=25000
Implementation Files
Core Files Created/Modified
- helpers/constants.js: Added UserTypes.PARTNER and UserTypes.PARTNER_SYSTEM_USER
- model/partner.js: Partner and PartnerSystemUser discriminator models
- controllers/partner.js: Partner and partner system user CRUD operations
- routes/partner.js: RESTful routes for partner management
- helpers/partner_config.js: Environment-based partner configuration
- services/satloc_service.js: SatLoc API integration using customer credentials
Documentation Updated
- docs/SATLOC_API_SPECIFICATION.md: Updated with dual-user architecture
- docs/IMPLEMENTATION_GUIDE.md: Step-by-step implementation with new approach
- docs/MONITORING_GUIDE.md: Simplified monitoring without complex infrastructure
Monitoring Strategy
Simplified Approach
- Basic Health Checks: Database, partner users, application health
- Essential Logging: Partner operations, sync activities, critical errors
- Simple Alerting: Email notifications for critical issues
- HTML Dashboard: Basic web interface for system status
No Complex Infrastructure
- ❌ No Grafana dashboards
- ❌ No Prometheus metrics
- ❌ No complex queue monitoring
- ✅ Simple health endpoints
- ✅ File-based logging
- ✅ Environment-based configuration
Benefits Summary
For Development
- Faster Implementation: Reuse existing User infrastructure
- Less Code: No separate partner models or complex management
- Easier Testing: Standard User entity patterns
- Better Maintainability: Fewer moving parts
For Operations
- Simple Deployment: Environment variables for configuration
- Easy Scaling: Add customers to partner systems easily
- Secure: Customer isolation and environment-based credentials
- Monitoring: Basic health checks without infrastructure overhead
For Business
- Customer Isolation: Each customer has own partner account
- Partner Flexibility: Easy to add new partners with environment config
- Cost Effective: No complex monitoring infrastructure required
- Scalable: Handles multiple customers per partner efficiently
This architecture provides all the benefits of partner integration while maintaining simplicity and avoiding the complexity of separate partner management systems.