| name | project-architecture |
| description | Use this skill to understand the RingCentral App Connect project structure, including the monorepo layout, core package APIs, handlers, models, and how components interact. |
Project Architecture
Repository Structure
rc-unified-crm-extension/
โโโ packages/ # Monorepo packages
โ โโโ core/ # @app-connect/core - shared business logic
โ โ โโโ handlers/ # Business logic handlers
โ โ โโโ models/ # Sequelize data models
โ โ โโโ lib/ # Utilities (jwt, analytics, logger, etc.)
โ โ โโโ connector/ # Connector registry
โ โ โโโ mcp/ # MCP (Model Context Protocol) tools
โ โโโ cli/ # CLI tools for project setup
โ โโโ template/ # Template for new connector projects
โโโ src/ # Main development server
โ โโโ connectors/ # CRM connector implementations
โ โโโ plugins/ # Data plugins
โ โโโ index.js # App entry point
โ โโโ server.js # Express server
โ โโโ lambda.js # AWS Lambda handler
โโโ serverless-deploy/ # Production deployment
โโโ serverless-deploy-test/ # Test environment deployment
โโโ docs/ # Documentation (MkDocs)
โโโ tests/ # Integration tests
Core Package (@app-connect/core)
Entry Point Usage
const { createCoreApp, connectorRegistry } = require('@app-connect/core');
connectorRegistry.setDefaultManifest(manifest);
connectorRegistry.registerConnector('myCRM', myCRMConnector, manifest);
const app = createCoreApp();
Handlers (packages/core/handlers/)
| Handler | File | Purpose |
|---|
| Auth | auth.js | OAuth flow, token refresh, API key auth |
| Contact | contact.js | Contact search, matching, creation |
| Log | log.js | Call/message logging, updates |
| Admin | admin.js | Admin settings, user mappings |
| User | user.js | User settings, preferences |
| Disposition | disposition.js | Call dispositions |
Models (packages/core/models/)
| Model | File | Purpose |
|---|
| UserModel | userModel.js | User auth, tokens, settings |
| CallLogModel | callLogModel.js | Call log records |
| MessageLogModel | messageLogModel.js | SMS/message logs |
| AdminConfigModel | adminConfigModel.js | Admin configurations |
| CacheModel | cacheModel.js | Caching layer |
Key Libraries (packages/core/lib/)
| Library | File | Purpose |
|---|
| JWT | jwt.js | Token encoding/decoding |
| Analytics | analytics.js | Usage tracking |
| Logger | logger.js | Structured logging |
| Constants | constants.js | Shared constants (LOG_DETAILS_FORMAT_TYPE, etc.) |
| CallLogComposer | callLogComposer.js | Compose call log details |
| ErrorHandler | errorHandler.js | Standardized error handling |
| Util | util.js | General utilities |
Connector Registry
The connector registry manages CRM connector lifecycle:
const { connectorRegistry } = require('@app-connect/core');
connectorRegistry.registerConnector('platformName', connectorModule, manifest);
connectorRegistry.registerConnectorInterface('platformName', 'createCallLog', customFn);
const connector = connectorRegistry.getConnector('platformName');
API Routes
Core routes provided by @app-connect/core:
Authentication
GET /authValidation - Validate auth
GET /oauth-callback - OAuth callback
POST /apiKeyLogin - API key login
POST /unAuthorize - Logout
Contacts
GET /contact - Find by phone
POST /contact - Create contact
GET /custom/contact/search - Search by name
Logging
GET /callLog - Get call log
POST /callLog - Create call log
PATCH /callLog - Update call log
PUT /callDisposition - Set disposition
POST /messageLog - Create message log
Settings
GET /user/settings - User settings
POST /user/settings - Update user settings
GET /admin/settings - Admin settings
POST /admin/settings - Update admin settings
Environment Variables
Key environment variables:
DATABASE_URL=postgres://...
DISABLE_SYNC_DB_TABLE=false
APP_SERVER_SECRET_KEY=secret
HASH_KEY=hash-key
IS_PROD=false
DYNAMODB_LOCALHOST=http://localhost:8000
PIPEDRIVE_CLIENT_ID=...
PIPEDRIVE_CLIENT_SECRET=...
PIPEDRIVE_ACCESS_TOKEN_URI=...
PIPEDRIVE_REDIRECT_URI=...
Development Workflow
npm run server
npm run ngrok
npm test
npm run build
npm run deploy
Database
- Development: SQLite (
db.sqlite)
- Production: PostgreSQL via Sequelize ORM
- Cache/Locks: DynamoDB (local via
npm run dynamo-local)