public async Task <APITemplateResource> CreateAPITemplateResourceAsync(APIConfig api, bool isSplit, bool isInitial)
        {
            // create api resource
            APITemplateResource apiTemplateResource = new APITemplateResource()
            {
                name       = $"[concat(parameters('ApimServiceName'), '/{api.name}')]",
                type       = ResourceTypeConstants.API,
                apiVersion = GlobalConstants.APIVersion,
                properties = new APITemplateProperties(),
                dependsOn  = new string[] { }
            };

            // add properties depending on whether the template is the initial, subsequent, or unified
            if (!isSplit || isInitial)
            {
                // add metadata properties for initial and unified templates
                // protocols can be pulled by converting the OpenApiSpec into the OpenApiDocument class
                OpenAPISpecReader openAPISpecReader = new OpenAPISpecReader();
                OpenApiDocument   doc = await openAPISpecReader.ConvertOpenAPISpecToDoc(api.openApiSpec);

                // supplied via optional arguments
                apiTemplateResource.properties.apiVersion             = api.apiVersion;
                apiTemplateResource.properties.subscriptionRequired   = api.subscriptionRequired;
                apiTemplateResource.properties.apiRevision            = api.revision;
                apiTemplateResource.properties.apiRevisionDescription = api.revisionDescription;
                apiTemplateResource.properties.apiVersionDescription  = api.apiVersionDescription;
                apiTemplateResource.properties.authenticationSettings = api.authenticationSettings;
                apiTemplateResource.properties.path        = api.suffix;
                apiTemplateResource.properties.isCurrent   = api.isCurrent;
                apiTemplateResource.properties.displayName = api.name;
                apiTemplateResource.properties.protocols   = this.CreateProtocols(doc);
                // set the version set id
                if (api.apiVersionSetId != null)
                {
                    // point to the supplied version set if the apiVersionSetId is provided
                    apiTemplateResource.properties.apiVersionSetId = $"[resourceId('Microsoft.ApiManagement/service/apiVersionSets', parameters('ApimServiceName'), '{api.apiVersionSetId}')]";
                }
                // set the authorization server id
                if (api.authenticationSettings != null && api.authenticationSettings.oAuth2 != null && api.authenticationSettings.oAuth2.authorizationServerId != null &&
                    apiTemplateResource.properties.authenticationSettings != null && apiTemplateResource.properties.authenticationSettings.oAuth2 != null && apiTemplateResource.properties.authenticationSettings.oAuth2.authorizationServerId != null)
                {
                    apiTemplateResource.properties.authenticationSettings.oAuth2.authorizationServerId = $"[resourceId('Microsoft.ApiManagement/service/authorizationServers', parameters('ApimServiceName'), '{api.authenticationSettings.oAuth2.authorizationServerId}')]";
                }
            }
            if (!isSplit || !isInitial)
            {
                // add swagger properties for subsequent and unified templates
                Uri  uriResult;
                bool isUrl = Uri.TryCreate(api.openApiSpec, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
                // used to escape sequences in local swagger json
                object deserializedFileContents = isUrl ? null : JsonConvert.DeserializeObject <object>(this.fileReader.RetrieveLocalFileContents(api.openApiSpec));
                // if openApiSpec is a url inline the url, if it is a local file inline the file contents
                apiTemplateResource.properties.format = isUrl ? "swagger-link-json" : "swagger-json";
                apiTemplateResource.properties.value  = isUrl ? api.openApiSpec : JsonConvert.SerializeObject(deserializedFileContents);
                // supplied via optional arguments
                apiTemplateResource.properties.path = api.suffix;
            }
            return(apiTemplateResource);
        }
        public async Task <APITemplateResource> CreateInitialAPITemplateResourceAsync(CreatorConfig creatorConfig)
        {
            // protocols can be pulled by converting the OpenApiSpec into the OpenApiDocument class
            OpenAPISpecReader openAPISpecReader = new OpenAPISpecReader();
            OpenApiDocument   doc = await openAPISpecReader.ConvertOpenAPISpecToDoc(creatorConfig.api.openApiSpec);

            // create api resource with properties
            APITemplateResource apiTemplateResource = new APITemplateResource()
            {
                name       = $"[concat(parameters('ApimServiceName'), '/{creatorConfig.api.name}')]",
                type       = "Microsoft.ApiManagement/service/apis",
                apiVersion = "2018-06-01-preview",
                properties = new APITemplateProperties()
                {
                    // supplied via optional arguments
                    apiVersion             = creatorConfig.api.apiVersion,
                    subscriptionRequired   = creatorConfig.api.subscriptionRequired,
                    apiRevision            = creatorConfig.api.revision,
                    apiRevisionDescription = creatorConfig.api.revisionDescription,
                    apiVersionDescription  = creatorConfig.api.apiVersionDescription,
                    authenticationSettings = creatorConfig.api.authenticationSettings,
                    path        = creatorConfig.api.suffix,
                    displayName = creatorConfig.api.name,
                    protocols   = this.CreateProtocols(doc)
                },
                // if the template is not linked the depends on for the apiVersionSet needs to be inlined here
                dependsOn = new string[] { }
            };
            string versionSetId = (creatorConfig.apiVersionSet != null && creatorConfig.apiVersionSet.id != null) ? creatorConfig.apiVersionSet.id : "versionset";

            // if the template is linked and a version set was created, the initial api depends on it
            if (creatorConfig.linked == false && creatorConfig.apiVersionSet != null)
            {
                apiTemplateResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/api-version-sets', parameters('ApimServiceName'), '{versionSetId}')]" };
            }
            // set the version set id
            if (creatorConfig.apiVersionSet != null)
            {
                apiTemplateResource.properties.apiVersionSetId = $"[resourceId('Microsoft.ApiManagement/service/api-version-sets', parameters('ApimServiceName'), '{versionSetId}')]";
            }
            else if (creatorConfig.api.apiVersionSetId != null)
            {
                apiTemplateResource.properties.apiVersionSetId = $"{creatorConfig.api.apiVersionSetId}";
            }
            return(apiTemplateResource);
        }