export function generateFlowAppForMicroservice()

in src/Generators/CodeGenerator/CodeGenerator.ts [87:161]


export function generateFlowAppForMicroservice(
  name: string,
  abi: string,
  contractAddress: string,
  solFilePath: string,
) {
  const { variables, functionsDefinitions } = parseSolidityContract(solFilePath);

  const flowApp = getFlowAppTemplate();
  const definition = getDefinitionTemplate();
  const switchBlock = getSwitchTemplate();
  const connectionReferenceName = `shared_${propertyBlockchainethereum}`;

  for (const item of [...variables, ...functionsDefinitions]) {
    const actions: { [key: string]: any } = {};
    const bodyParameters: { [key: string]: any } = {};
    const action = getActionFlowAppTemplate();
    const actionResponseData = getActionResponseTemplate();

    if (item.type === 'FunctionDefinition') {
      for (const parameter of item.parameters) {
        bodyParameters[parameter.name] = `@triggerBody()?['${propertyInputParameters}']?['${parameter.name}']`;
        action.inputs.parameters[`parameters/${parameter.name}`] = `${propertyInputParameters}.${parameter.name}`;
      }

      if (item.stateMutability === 'view' || item.stateMutability === 'pure') {
        action.inputs.host.operationId = item.parameters.length ? 'ExecuteSmartContractFunction' : 'GetSmartContractProperties';
      } else {
        action.inputs.host.operationId = 'ExecuteContractFunction';
      }

      actionResponseData.inputs.body = item.returnParameters
          ? `@outputs('${item.name}')?['body/Function Output']`
          : `@body('${item.name}')`;
    } else {
      action.inputs.host.operationId = 'GetSmartContractProperties';
      actionResponseData.inputs.body = `@outputs('${item.name}')?['body/${item.name}']`;
    }

    action.inputs.host.connectionName = connectionReferenceName;
    action.inputs.host.apiId = `/providers/Microsoft.PowerApps/apis/${connectionReferenceName}`;

    action.inputs.parameters.contractAddress = contractAddress;
    action.inputs.parameters.functionName = item.name!;
    action.inputs.parameters.abi = abi;

    actionResponseData.runAfter[item.name!] = [ 'Succeeded' ];

    actions[item.name!] = action;
    actions[`${item.name}Response`] = actionResponseData;

    const caseBlock = getCaseTemplate();
    caseBlock.case = item.name!;
    caseBlock.actions = actions;

    switchBlock.Switch.cases[`Case_${item.name}`] = caseBlock;
  }

  switchBlock.Switch.expression = `@triggerBody()?['${propertyFunctionName}']`;

  definition.actions = switchBlock;
  definition.triggers.manual.inputs.schema.properties[propertyInputParameters] = { type: 'object' };
  definition.triggers.manual.inputs.schema.properties[propertyFunctionName] = { type: 'string' };

  const clientData = getClientDataTemplate();
  clientData.properties.definition = definition;
  clientData.properties.displayName = name;
  clientData.properties.connectionReferences[connectionReferenceName] = getConnectionReferenceTemplate();
  clientData.properties.connectionReferences[connectionReferenceName].id = `/providers/Microsoft.PowerApps/apis/${connectionReferenceName}`;

  flowApp.clientdata = JSON.stringify(clientData);
  flowApp.name = name;

  return flowApp;
}