@cap-js-community/sap-afc-sdk
Version:
SAP Advanced Financial Closing SDK for CDS
169 lines (155 loc) • 5.25 kB
JavaScript
/* eslint-disable no-console */
;
const fs = require("fs");
const path = require("path");
const cds = require("@sap/cds");
const { projectName, isNode, readYAML, generateHashBrokerPassword, adjustYAMLAllDocuments } = require("../common/util");
const YAML = require("yaml");
const BROKER_PATH = path.join(process.cwd(), "srv/broker.json");
const CATALOG_PATH = path.join(process.cwd(), "srv/catalog.json");
const APP_NAME = projectName() ?? "afc-scheduling-provider";
const BROKER_USER = "broker-user";
const BROKER = {
SBF_SERVICE_CONFIG: {
[APP_NAME]: {
extend_credentials: {
shared: {
endpoints: {
api: "/api",
"job-scheduling-v1": "/api/job-scheduling/v1",
},
"oauth2-configuration": {
"credential-types": ["binding-secret", "x509"],
},
},
},
extend_xssecurity: {
shared: {
"oauth2-configuration": {
"credential-types": ["binding-secret", "x509"],
},
},
},
},
},
SBF_BROKER_CREDENTIALS_HASH: {
[BROKER_USER]: "",
},
};
const CATALOG = {
services: [
{
id: cds.utils.uuid(),
name: APP_NAME,
description: "AFC Scheduling Provider Service",
bindable: true,
plans: [
{
id: cds.utils.uuid(),
name: "standard",
description: "Standard plan",
free: true,
bindable: true,
plan_updateable: true,
},
],
metadata: {
displayName: "AFC Scheduling Provider Service",
longDescription: "Scheduling Provider Service for SAP Advanced Financial Closing",
},
},
],
};
function fileExists(path) {
return fs.existsSync(path);
}
function writeFile(path, content) {
if (fs.existsSync(path)) {
console.log(`File '${path}' already exists and is not overwritten.`);
return false;
}
fs.writeFileSync(path, JSON.stringify(content, null, 2));
console.log(`File '${path}' written.`);
return true;
}
module.exports = (options) => {
if (
!(
readYAML("mta.yaml")?.resources?.find(
(r) => r?.parameters?.service === "xsuaa" && r?.parameters?.["service-plan"] === "broker",
) || readYAML("chart/values.yaml")?.xsuaa?.servicePlanName === "broker"
)
) {
console.log(`Broker feature requires a project using xsuaa with service plan 'broker'`);
return false;
}
// Catalog
if (process.env.BROKER_SERVICE_ID) {
CATALOG.services[0].id = process.env.BROKER_SERVICE_ID;
}
if (process.env.BROKER_SERVICE_PLAN_ID) {
CATALOG.services[0].plans[0].id = process.env.BROKER_SERVICE_PLAN_ID;
}
// Broker
let brokerPassword = {};
if (!fileExists(BROKER_PATH)) {
if (process.env.BROKER_PASSWORD_HASH) {
BROKER.SBF_BROKER_CREDENTIALS_HASH[BROKER_USER] = process.env.BROKER_PASSWORD_HASH;
} else {
brokerPassword = generateHashBrokerPassword();
BROKER.SBF_BROKER_CREDENTIALS_HASH[BROKER_USER] = brokerPassword.hash;
}
}
let brokerWritten = false;
if (isNode(options)) {
writeFile(CATALOG_PATH, CATALOG);
if (writeFile(BROKER_PATH, BROKER)) {
brokerWritten = true;
}
} else {
adjustYAMLAllDocuments("srv/src/main/resources/application.yaml", (yamls) => {
let yaml = yamls.find((yaml) => !yaml.getIn(["spring", "config.activate.on-profile"]));
if (!yaml) {
yaml = new YAML.Document();
yamls.unshift(yaml);
}
if (!yaml.getIn(["spring", "cloud", "openservicebroker"])) {
yaml.setIn(["spring", "cloud", "openservicebroker", "catalog"], CATALOG);
}
if (!yaml.getIn(["sap-afc-sdk", "broker", "enabled"])) {
if (!yaml.getIn(["sap-afc-sdk", "broker"])) {
yaml.setIn(["sap-afc-sdk", "broker"], yaml.createNode());
}
yaml.setIn(["sap-afc-sdk", "broker", "enabled"], true);
if (!yaml.getIn(["sap-afc-sdk", "broker", "name"])) {
yaml.setIn(["sap-afc-sdk", "broker", "name"], APP_NAME);
}
if (!yaml.getIn(["sap-afc-sdk", "broker", "user"])) {
yaml.setIn(["sap-afc-sdk", "broker", "user"], BROKER_USER);
}
if (!yaml.getIn(["sap-afc-sdk", "broker", "credentialsHash"])) {
yaml.setIn(["sap-afc-sdk", "broker", "credentialsHash"], BROKER.SBF_BROKER_CREDENTIALS_HASH[BROKER_USER]);
}
if (!yaml.getIn(["sap-afc-sdk", "broker", "endpoints"])) {
yaml.setIn(
["sap-afc-sdk", "broker", "endpoints"],
BROKER.SBF_SERVICE_CONFIG[APP_NAME].extend_credentials.shared.endpoints,
);
}
if (!yaml.getIn(["sap-afc-sdk", "broker", "oauth2-configuration", "credential-types"])) {
yaml.setIn(
["sap-afc-sdk", "broker", "oauth2-configuration", "credential-types"],
BROKER.SBF_SERVICE_CONFIG[APP_NAME].extend_credentials.shared["oauth2-configuration"]["credential-types"],
);
}
brokerWritten = true;
}
return yamls;
});
}
if (brokerWritten && brokerPassword.clear) {
console.log(
`Keep it safe to create broker and to fetch key after deployment: afc api key -p '${brokerPassword.clear}'`,
);
}
};