diff --git a/extensions/sql-bindings/src/common/azureFunctionsUtils.ts b/extensions/sql-bindings/src/common/azureFunctionsUtils.ts index 6c6af956a639..e5cf02b9d583 100644 --- a/extensions/sql-bindings/src/common/azureFunctionsUtils.ts +++ b/extensions/sql-bindings/src/common/azureFunctionsUtils.ts @@ -2,7 +2,6 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as os from 'os'; import * as fs from 'fs'; import * as vscode from 'vscode'; import * as path from 'path'; @@ -133,32 +132,6 @@ export async function getAzureFunctionsExtensionApi(): Promise { const settingsFile = await getSettingsFile(projectFile); if (settingsFile) { - await setLocalAppSetting(path.dirname(settingsFile), constants.sqlConnectionString, connectionString); + await setLocalAppSetting(path.dirname(settingsFile), constants.sqlConnectionStringSetting, connectionString); } } diff --git a/extensions/sql-bindings/src/common/constants.ts b/extensions/sql-bindings/src/common/constants.ts index f7fda5da4d27..e3c131585de6 100644 --- a/extensions/sql-bindings/src/common/constants.ts +++ b/extensions/sql-bindings/src/common/constants.ts @@ -10,21 +10,14 @@ const localize = nls.loadMessageBundle(); // Azure Functions export const azureFunctionsExtensionName = 'ms-azuretools.vscode-azurefunctions'; -export const sqlConnectionString = 'SqlConnectionString'; export const linkToAzureFunctionExtension = 'https://docs.microsoft.com/azure/azure-functions/functions-develop-vs-code'; export const sqlBindingsDoc = 'https://aka.ms/sqlbindings'; -export const defaultSqlBindingTextLines = - [ - 'log.LogInformation(\"C# HTTP trigger function processed a request.\");', - 'string name = req.Query[\"name\"];', - 'string requestBody = await new StreamReader(req.Body).ReadToEndAsync();', - 'dynamic data = JsonConvert.DeserializeObject(requestBody);', - 'name = name ?? data?.name;', - 'string responseMessage = string.IsNullOrEmpty(name) ? \"This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.\" : $\"Hello, {name}. This HTTP triggered function executed successfully.\";' - ]; -export const defaultBindingResult = 'return new OkObjectResult(responseMessage);'; -export const sqlBindingResult = `return new OkObjectResult(result);`; +export const sqlConnectionStringSetting = 'SqlConnectionString'; +export const azureWebJobsStorageSetting = 'AzureWebJobsStorage'; +export const azureWebJobsStoragePlaceholder = 'Enter your Azure Web Jobs storage connection string'; export const sqlExtensionPackageName = 'Microsoft.Azure.WebJobs.Extensions.Sql'; +export const inputTemplateID = 'SqlInputBinding'; +export const outputTemplateID = 'SqlOutputBinding'; export const functionNameTitle = localize('functionNameTitle', 'Function Name'); export const selectProject = localize('selectProject', 'Select the Azure Function project for the SQL Binding'); export const azureFunctionsExtensionNotFound = localize('azureFunctionsExtensionNotFound', 'The Azure Functions extension is required to create a new Azure Function with SQL binding but is not installed, install it now?'); @@ -65,7 +58,6 @@ export const noAzureFunctionsProjectsInWorkspace = localize('noAzureFunctionsPro export const addPackage = localize('addPackage', "Add Package"); export const createNewLocalAppSetting = localize('createNewLocalAppSetting', 'Create new local app setting'); export const createNewLocalAppSettingWithIcon = `$(add) ${createNewLocalAppSetting}`; -export const sqlConnectionStringSetting = 'SqlConnectionString'; export const valueMustNotBeEmpty = localize('valueMustNotBeEmpty', "Value must not be empty"); export const enterConnectionStringSettingName = localize('enterConnectionStringSettingName', "Enter connection string setting name"); export const enterConnectionString = localize('enterConnectionString', "Enter connection string"); diff --git a/extensions/sql-bindings/src/services/azureFunctionsService.ts b/extensions/sql-bindings/src/services/azureFunctionsService.ts index 9cbb76dc09f4..44665933e00c 100644 --- a/extensions/sql-bindings/src/services/azureFunctionsService.ts +++ b/extensions/sql-bindings/src/services/azureFunctionsService.ts @@ -55,7 +55,6 @@ export async function createAzureFunction(connectionString: string, schema: stri // because of an AF extension API issue, we have to get the newly created file by adding a watcher // issue: https://github.com/microsoft/vscode-azurefunctions/issues/2908 const newFunctionFileObject = azureFunctionsUtils.waitForNewFunctionFile(projectFile); - let functionFile: string; let functionName: string; try { @@ -71,41 +70,43 @@ export async function createAzureFunction(connectionString: string, schema: stri return; } - // create C# HttpTrigger + // select input or output binding + const selectedBinding = await azureFunctionsUtils.promptForBindingType(); + + if (!selectedBinding) { + return; + } + + // set the templateId based on the selected binding type + let templateId: string = selectedBinding.type === BindingType.input ? constants.inputTemplateID : constants.outputTemplateID; + let objectName = utils.generateQuotedFullName(schema, table); + + // We need to set the azureWebJobsStorage to a placeholder + // to suppress the warning for opening the wizard + // issue https://github.com/microsoft/azuredatastudio/issues/18780 + + await azureFunctionsUtils.setLocalAppSetting(path.dirname(projectFile), constants.azureWebJobsStorageSetting, constants.azureWebJobsStoragePlaceholder); + + // create C# Azure Function with SQL Binding await azureFunctionApi.createFunction({ language: 'C#', - templateId: 'HttpTrigger', + templateId: templateId, functionName: functionName, + functionSettings: { + connectionStringSetting: constants.sqlConnectionStringSetting, + ...(selectedBinding.type === BindingType.input && { object: objectName }), + ...(selectedBinding.type === BindingType.output && { table: objectName }) + }, folderPath: projectFile }); // check for the new function file to be created and dispose of the file system watcher const timeoutForFunctionFile = utils.timeoutPromise(constants.timeoutAzureFunctionFileError); - functionFile = await Promise.race([newFunctionFileObject.filePromise, timeoutForFunctionFile]); + await Promise.race([newFunctionFileObject.filePromise, timeoutForFunctionFile]); } finally { newFunctionFileObject.watcherDisposable.dispose(); } - - // select input or output binding - const selectedBinding = await azureFunctionsUtils.promptForBindingType(); - - if (!selectedBinding) { - return; - } - - await azureFunctionsUtils.addNugetReferenceToProjectFile(projectFile); await azureFunctionsUtils.addConnectionStringToConfig(connectionString, projectFile); - - let objectName = utils.generateQuotedFullName(schema, table); - await addSqlBinding( - selectedBinding.type, - functionFile, - functionName, - objectName, - constants.sqlConnectionString - ); - - azureFunctionsUtils.overwriteAzureFunctionMethodBody(functionFile); } }