npm package: @sapmentors/cds-scp-api
Description: CDS Extension for External Service Consumption
Author: SAP Mentors & Friends
Latest version: 1.0.4

# CDS-SCP-API Node Module 

## CDS Extension for SAP Cloud Platform API Consumption
The node module CDS-SCP-API simplifies the consuming external API from SAP OnPremise & Cloud APIs, Microsoft Office 365 APIs, Google Cloud Platform APIs, and other REST APIs in a Cloud Application Programming (CAP) Model on the SAP Cloud Platform. The module provides:
- Fluent API consumption concept
- Endpoint and Configuration using SAP Cloud Platform Destination and Connectivity services
- Support of all kind of APIs including SAP OnPremise & Cloud OData and Rest APIs, Microsoft Office 365 APIs, Google Cloud Platform APIs and other REST APIs 
- Easy API http request configuration based on Axios config options 

## History
Jhodel Cailan initially started the CDS Extension concept. SAP Mentor Robert Eijpe created a similar concept integrating Microsoft Azure and Google Cloud APIs into a CDS external services concept. The SAP Devtoberfest 2020 challenge brought concepts together. And this results in a CDS-SCP-API Node Module for the community, making SAP developers' lives better.

## Installation

Using npm:

```swift
> npm install @sapmentors/cds-scp-api
```

## Javascript/Node.js Code
```javascript
// Load the module
const cdsapi = require("cds-scp-api");

// Create a connection
const service = await cdsapi.connect.to("SCPDestination");

// Request the API using Axios Config
let result = await service.run({
               url: "/pathOfService"
             })

```
## Example Programs

Click [here](./examples/readme.md) for examples and environment setup

## Supported Destination Types

- Internet Destinations with No Authentication 
- Internet Destinations with Basic Authentication
- Internet Destinations with Client Credentials Authentication (including Microsoft Azure)
- Internet Destinations with JWT token Authentication (currently only Google Cloud Platform)
- OnPremise Destination and Connectivity via Cloud Connector with No Authentication 
- OnPremise Destinations and Connectivity via Cloud Connector with Basic Authentication

## SCP Destination Configuration Examples

- [SAP Cloud Platform Internet Destinations with No Authentication](./docs/InternetAPIwithNoAuthentication.md)
- [SAP Cloud Platform Internet Destinations with Basic Authentication](./docs/InternetAPIwithBasicAuthentication.md)
- [SAP Cloud Platform Internet Destinations for Microsoft 365/Azure via MSGraph ](./docs/InternetAPIforAzure.md)
- [SAP Cloud Platform Internet Destinations for GSuite/Google Cloud Platform ](./docs/InternetAPIforGCP.md)

## CDS-SCP-API Config Settings
The CDS-SCP-API is an SAP Cloud Platform layer on top of Axios. The configuration settings of the CDS-SCP-API **service.run** code is simular to Axios options, which are documented [here](https://github.com/axios/axios#request-config). CDS-SCP-API will ignore the Axios config settings for the authentification, the proxy settings, and the baseURL. The CDS-SCP-API retrieves these settings from the SAP Cloud Platform Destination & Connectivity services. 

### Compare Axios with CDS-SCP-API
- Axios implementation
  ```javascript
  async function AxiosGetRequestwithBasicAuthentication() {
	  return await axios({
	  	url: 'https://sapes5.sapdevcenter.com/sap/opu/odata/sap/EPM_REF_APPS_SHOP_SRV/Products?$top=2',
		  auth: {
			  username: '<SAP S-number>',
			  password: '<My password>'
		  }
	  })
  }
  ```

- CDS-SCP-API implementation
  ```javascript
  async function InternetAPIGetRequestwithBasicAuthentication() {
	  const service = await cdsapi.connect.to("ES5");
	  return await service.run({
		  url: "/sap/opu/odata/sap/EPM_REF_APPS_SHOP_SRV/Products?$top=2"
	  })
  }  
  ```
CDS-SCP-API implementation uses relative URLs, and authorization is configured in the SAP Cloud Platform and handled by the CDS-SCP-API implementation.

### Post requests with CSRF token protection
  ```javascript
async function InternetAPIPostRequestwithBasicAuthentication() {
	const product = {
		"ProductID": "NL4B-101",
		"TypeCode": "PR",
		"Category": "Notebooks",
		"Name": "Psychiatric Help",
		"NameLanguage": "EN",
		"Description": "",
		"DescriptionLanguage": "",
		"SupplierID": "0100000000",
		"SupplierName": "SAP",
		"TaxTarifCode": 1,
		"MeasureUnit": "EA",
		"WeightMeasure": "0.000",
		"WeightUnit": "",
		"CurrencyCode": "EUR",
		"Price": "0.05",
		"Width": "0.000",
		"Depth": "0.000",
		"Height": "0.000",
		"DimUnit": "",
		"CreatedAt": "\/Date(1602106635169)\/",
		"ChangedAt": "\/Date(1602106635169)\/"
	}

	const service = await cdsapi.connect.to("ES5");
	return await service.run({
		url: "/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/ProductSet",
		method: "post",
		headers: {
			'content-type': 'application/json'
		},
		data: product,
		csrfProtection: true
	})
}
  ```
When request needs a X-CSRF token to fulfill, you can easily add the setting **csrfProtection: true**

### Simultaneous requests
  ```javascript
async function SimultaneousRequests() {
	const service = await cdsapi.connect.to("ES5")
	axios.all([
		service.run({
			url: "/sap/opu/odata/sap/EPM_REF_APPS_SHOP_SRV/Products?$top=2"
		}),
		service.run({
			url: "/sap/opu/odata/sap/EPM_REF_APPS_SHOP_SRV/Products?$top=3"
		})
	])
		.then(axios.spread((request1, request2) => {
			console.log('Results request1: ', request1.d.results[0].Name);
			console.log('Results request2: ', request2.d.results[0].Name);
		}));

}
  ```