File: AppSettingsTransform.cs
Web Access
Project: ..\..\..\src\WebSdk\Publish\Tasks\Microsoft.NET.Sdk.Publish.Tasks.csproj (Microsoft.NET.Sdk.Publish.Tasks)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Text.Json;
using Microsoft.Build.Framework;
 
namespace Microsoft.NET.Sdk.Publish.Tasks
{
    public static class AppSettingsTransform
    {
        public static string GenerateDefaultAppSettingsJsonFile()
        {
            string tempFileFullPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
 
            string defaultAppSettingsJsonString = ToJson(new
            {
                ConnectionStrings = new
                {
                    DefaultConnection = string.Empty
                }
            });
 
            File.WriteAllText(tempFileFullPath, defaultAppSettingsJsonString);
 
            return tempFileFullPath;
        }
 
        public static bool UpdateDestinationConnectionStringEntries(string destinationAppSettingsFilePath, ITaskItem[]? destinationConnectionStrings)
        {
            if (!File.Exists(destinationAppSettingsFilePath))
            {
                return false;
            }
 
            if (destinationConnectionStrings == null || destinationConnectionStrings.Length == 0)
            {
                return false;
            }
 
            string appSettingsJsonContent = File.ReadAllText(destinationAppSettingsFilePath);
            var appSettingsModel = FromJson<AppSettingsModel>(appSettingsJsonContent);
            if (appSettingsModel is not null && appSettingsModel.ConnectionStrings is null)
            {
                appSettingsModel.ConnectionStrings = new Dictionary<string, string>();
            }
 
            foreach (ITaskItem destinationConnectionString in destinationConnectionStrings)
            {
                string key = destinationConnectionString.ItemSpec;
                string Value = destinationConnectionString.GetMetadata("Value");
                if (appSettingsModel?.ConnectionStrings is not null)
                {
                    appSettingsModel.ConnectionStrings[key] = Value;
                }
            }
 
            File.WriteAllText(destinationAppSettingsFilePath, ToJson(appSettingsModel));
 
            return true;
        }
 
        private static string ToJson<T>(T obj)
        {
            return JsonSerializer.Serialize(obj,
                new JsonSerializerOptions
                {
                    WriteIndented = true
                });
        }
 
        private static T? FromJson<T>(string jsonString)
        {
            return JsonSerializer.Deserialize<T>(jsonString,
                new JsonSerializerOptions
                {
                    AllowTrailingCommas = true,
                    ReadCommentHandling = JsonCommentHandling.Skip
                });
        }
    }
}