# CAP Development Reference ## Overview SAP Cloud Application Programming Model (CAP) is SAP's recommended framework for building enterprise-grade applications on SAP BTP using Node.js or Java. ## Operational Profiles CAP provides three operational profiles for different development stages: ### Development Profile **Database**: SQLite (Node.js) / H2 (Java) **Features:** - Rapid prototyping with minimal setup - Mocked variants of SAP BTP services (authentication, database, messaging, app gateway) - No BTP subscription required - Cost-effective testing **Usage:** ```bash cds watch # Automatically uses development profile ``` ### Hybrid Profile **Database**: Cloud services (e.g., SAP HANA Cloud) **Features:** - Run application locally - Bind to real cloud services for integration testing - Use `cds bind` or local configuration files - Test with production-like data **Usage:** ```bash cds bind --to hana:my-hana-instance cds watch --profile hybrid ``` ### Production Profile **Database**: SAP HANA Cloud **Features:** - Deployed to SAP BTP (Cloud Foundry or Kyma) - Platform-managed service bindings - Production configuration for logging and security - Database migrations via `cds deploy` **Usage:** ```bash cds build --production cf deploy mta_archives/my-app.mtar ``` ### Profile Summary | Profile | Database | Use Case | |---------|----------|----------| | Development | SQLite/H2 | Local prototyping, mock services | | Hybrid | Cloud services | Local app with cloud DB/services | | Production | SAP HANA Cloud | Full cloud deployment | ## Supported Languages and Runtimes | Language | Framework | Runtime Options | |----------|-----------|-----------------| | Node.js | Express.js | Cloud Foundry, Kyma | | Java | Spring Boot | Cloud Foundry, Kyma | | TypeScript | Node.js | Cloud Foundry, Kyma | ## Development Tools | Tool | Purpose | |------|---------| | SAP Business Application Studio | Primary cloud IDE | | Visual Studio Code | Local development with CDS extension | | IntelliJ IDEA | Java CAP development | | CDS CLI | Command-line development | ## Core CDS Commands ```bash # Initialize new project cds init my-project # Add features cds add hana # SAP HANA Cloud support cds add xsuaa # Authentication cds add mta # MTA descriptor cds add helm # Helm charts for Kyma cds add multitenancy # Multitenant support cds add approuter # Application router # Development cds watch # Run with live reload cds build # Build for deployment cds deploy # Deploy to HANA # Service inspection cds compile # Compile CDS models cds serve # Start services ``` ## Domain Modeling with CDS ### Entity Definition ```cds namespace my.bookshop; entity Books { key ID : UUID; title : String(111); author : Association to Authors; stock : Integer; } entity Authors { key ID : UUID; name : String(111); books : Association to many Books on books.author = $self; } ``` ### Service Definition ```cds using my.bookshop from '../db/schema'; service CatalogService { @readonly entity Books as projection on bookshop.Books; entity Authors as projection on bookshop.Authors; action submitOrder(book: Books:ID, quantity: Integer); } ``` ## CAP Design Principles ### Domain-Driven Design - Focus on core domain logic - Align code structure with business concepts - Collaboration between technical and domain experts ### Agnostic Design CAP abstracts: - Deployment approaches - Authentication strategies - Protocols (REST, OData, GraphQL) - Asynchronous channels - Database technologies ### Out-of-the-Box Integration - SAP HANA Cloud for persistence - Authorization management services - Connectivity tools for external systems ## Platform Integration ### Database Support | Database | Use Case | |----------|----------| | SQLite | Development (Node.js) | | H2 | Development (Java) | | PostgreSQL | Production alternative | | SAP HANA Cloud | Production (recommended) | ### Service Bindings ```yaml # mta.yaml service binding example modules: - name: my-srv type: nodejs requires: - name: my-hana - name: my-xsuaa - name: my-destination resources: - name: my-hana type: com.sap.xs.hdi-container - name: my-xsuaa type: org.cloudfoundry.managed-service parameters: service: xsuaa service-plan: application ``` ## Microservices Architecture CAP supports microservice development with: - Separate lifecycles per service - Independent runtimes - Event-based communication **Considerations:** - Microservices introduce complexity - Potential performance trade-offs - Start monolithic, extract when needed ## API Consumption ### Supported Protocols - OData V2/V4 - REST - OpenAPI ### SAP Cloud SDK Integration **Generate typed client** (recommended approach): ```bash # Generate OData client from service specification npx @sap-cloud-sdk/generator --input ./API_BUSINESS_PARTNER.edmx --outputDir ./generated ``` **Use generated client**: ```javascript // Import from generated client (path depends on generator output) const { businessPartnerApi } = require('./generated/business-partner-service'); // Fetch business partners from S/4HANA const businessPartners = await businessPartnerApi .requestBuilder() .getAll() .execute({ destinationName: 'S4HANA' }); ``` > **Note**: The `@sap/cloud-sdk-vdm-*` packages are deprecated. Use `@sap-cloud-sdk/generator` to generate typed clients from OData service specifications. See [SAP Cloud SDK documentation](https://sap.github.io/cloud-sdk/docs/js/features/odata/generate-client) for details. ## Multitenancy ### Enable Multitenancy ```bash cds add multitenancy ``` ### Key Features - Tenant isolation - Per-tenant database schemas - Subscription lifecycle hooks - Resource sharing across tenants ### SaaS Entry Points | Approach | Description | Consumer Requirements | |----------|-------------|----------------------| | Central | SAP Build Work Zone managed | Own Work Zone instance | | Local | Standalone app router | None | ## Extensibility ### In-App Extensions ```cds // Extend existing service extend service CatalogService with { entity CustomEntity { key ID : UUID; customField : String; } } ``` ### Custom Handlers ```javascript // srv/cat-service.js module.exports = (srv) => { srv.before('CREATE', 'Books', async (req) => { // Validation logic if (!req.data.title) { req.error(400, 'Title is required'); } }); srv.on('submitOrder', async (req) => { // Custom action implementation const { book, quantity } = req.data; // Process order... }); }; ``` ## Security Implementation ### Authentication ```cds // Require authentication service CatalogService @(requires: 'authenticated-user') { entity Books as projection on bookshop.Books; } ``` ### Authorization ```cds // Role-based access service AdminService @(requires: 'admin') { entity Books as projection on bookshop.Books; @(restrict: [{ grant: 'READ', to: 'viewer' }]) entity Reports { ... } } ``` ### Built-in Security Features - Parameterized queries (SQL injection prevention) - CSRF protection for UI applications - CDS constraints for input validation ## Testing ### Unit Testing with Jest ```javascript const cds = require('@sap/cds'); describe('CatalogService', () => { let srv; beforeAll(async () => { srv = await cds.connect.to('CatalogService'); }); it('should return books', async () => { const books = await srv.read('Books'); expect(books).toBeDefined(); }); }); ``` ### Integration Testing ```bash # Run tests npm test # With coverage npm test -- --coverage ``` ## Deployment Commands ### Cloud Foundry ```bash # Build MTA mbt build # Deploy cf deploy mta_archives/my-project_1.0.0.mtar # Or with cf push for simple apps cf push ``` ### Kyma ```bash # Add Helm support cds add helm # Deploy with Helm helm upgrade --install my-app ./chart ``` ## Common Issues and Solutions | Issue | Cause | Solution | |-------|-------|----------| | `HANA deployment fails` | Wrong HDI container | Verify `requires` in mta.yaml | | `Authentication errors` | XSUAA not bound | Run `cf bind-service` | | `Database connection refused` | Wrong profile | Set `NODE_ENV=production` | | `Model compilation errors` | CDS syntax | Run `cds compile --to json` for details | ## Source Documentation - CAP Documentation: [https://cap.cloud.sap/docs/](https://cap.cloud.sap/docs/) - SAP BTP CF/Kyma with CAP: [https://github.com/SAP-docs/btp-developer-guide/blob/main/docs/sap-btp-cloud-foundry-and-sap-btp-kyma-runtimes-with-cap-0f9cfe9.md](https://github.com/SAP-docs/btp-developer-guide/blob/main/docs/sap-btp-cloud-foundry-and-sap-btp-kyma-runtimes-with-cap-0f9cfe9.md) - Development Guide: [https://github.com/SAP-docs/btp-developer-guide/blob/main/docs/develop-7e30686.md](https://github.com/SAP-docs/btp-developer-guide/blob/main/docs/develop-7e30686.md)