diff --git a/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs b/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs index 44f92347..0cf81912 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/HostLoader.cs @@ -34,6 +34,7 @@ using Microsoft.SqlTools.ServiceLayer.SqlContext; using Microsoft.SqlTools.ServiceLayer.Workspace; using Microsoft.SqlTools.ServiceLayer.NotebookConvert; using Microsoft.SqlTools.ServiceLayer.ModelManagement; +using Microsoft.SqlTools.ServiceLayer.TableDesigner; namespace Microsoft.SqlTools.ServiceLayer { @@ -152,12 +153,15 @@ namespace Microsoft.SqlTools.ServiceLayer NotebookConvertService.Instance.InitializeService(serviceHost); serviceProvider.RegisterSingleService(NotebookConvertService.Instance); - InsightsGeneratorService.Instance.InitializeService(serviceHost); + InsightsGeneratorService.Instance.InitializeService(serviceHost); serviceProvider.RegisterSingleService(InsightsGeneratorService.Instance); - + MigrationService.Instance.InitializeService(serviceHost); serviceProvider.RegisterSingleService(MigrationService.Instance); + TableDesignerService.Instance.InitializeService(serviceHost); + serviceProvider.RegisterSingleService(TableDesignerService.Instance); + InitializeHostedServices(serviceProvider, serviceHost); serviceHost.ServiceProvider = serviceProvider; diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/CheckBoxProperties.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/CheckBoxProperties.cs new file mode 100644 index 00000000..57fd223b --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/CheckBoxProperties.cs @@ -0,0 +1,15 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Checkbox properties + /// + public class CheckBoxProperties : ComponentPropertiesBase + { + public bool Checked { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/ComponentPropertiesBase.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/ComponentPropertiesBase.cs new file mode 100644 index 00000000..f02c023d --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/ComponentPropertiesBase.cs @@ -0,0 +1,28 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Base class for component properties + /// + public abstract class ComponentPropertiesBase + { + public ComponentPropertiesBase() + { + this.Enabled = true; + } + + public string Title { get; set; } + + public string AriaLabel { get; set; } + + public Nullable Width { get; set; } + + public bool Enabled { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/DropdownProperties.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/DropdownProperties.cs new file mode 100644 index 00000000..e6b99195 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/DropdownProperties.cs @@ -0,0 +1,17 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Dropdown properties + /// + public class DropdownProperties : ComponentPropertiesBase + { + public string Value { get; set; } + + public string[] Values { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/InputBoxProperties.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/InputBoxProperties.cs new file mode 100644 index 00000000..97bcf930 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/InputBoxProperties.cs @@ -0,0 +1,15 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Inputbox properties + /// + public class InputBoxProperties : ComponentPropertiesBase + { + public string Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/TableProperties.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/TableProperties.cs new file mode 100644 index 00000000..22944b91 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Components/TableProperties.cs @@ -0,0 +1,33 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Table component properties + /// + public class TableProperties : ComponentPropertiesBase + { + /// + /// The column names to be displayed + /// + public string[] Columns { get; set; } + + /// + /// The object type display name of the objects in this table + /// + public string ObjectTypeDisplayName { get; set; } + + /// + /// All properties of the object. + /// + public DesignerDataPropertyInfo[] ItemProperties { get; set; } + + /// + /// The object list. + /// + public T[] Data { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/DesignerDataPropertyInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/DesignerDataPropertyInfo.cs new file mode 100644 index 00000000..bdc6c9f1 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/DesignerDataPropertyInfo.cs @@ -0,0 +1,31 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Represents a component/property in the table designer + /// + public class DesignerDataPropertyInfo + { + /// + /// The name of the property + /// + public string PropertyName { get; set; } + + public string ComponentType { get; set; } + + /// + /// The name of the group the property will be placed in whe displayed in + /// + public string Group { get; set; } + + + /// + /// The properties of component + /// + public ComponentPropertiesBase ComponentProperties { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GetTableDesignerInfoRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GetTableDesignerInfoRequest.cs new file mode 100644 index 00000000..6ea8ea3b --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/GetTableDesignerInfoRequest.cs @@ -0,0 +1,20 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The service request to get the designer information about a table. + /// + public class GetTableDesignerInfoRequest + { + /// + /// Request definition + /// + public static readonly RequestType Type = RequestType.Create("tabledesigner/gettabledesignerinfo"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs new file mode 100644 index 00000000..83f1d856 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/ProcessTableDesignerEditRequest.cs @@ -0,0 +1,39 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + public class ProcessTableDesignerEditRequestParams : GeneralRequestDetails + { + public TableInfo TableInfo { get; set; } + + public TableDesignerChangeInfo TableChangeInfo { get; set; } + + public TableDataModel Data { get; set; } + } + + public class ProcessTableDesignerEditResponse + { + public TableDataModel Data { get; set; } + + public bool IsValid { get; set; } + + public TableDesignerValidationError[] errors { get; set; } + } + + /// + /// The service request to process the changes made in the table designer. + /// + public class ProcessTableDesignerEditRequest + { + /// + /// Request definition + /// + public static readonly RequestType Type = RequestType.Create("tabledesigner/processedit"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs new file mode 100644 index 00000000..520cf555 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/Requests/SaveTableChangesRequest.cs @@ -0,0 +1,32 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + public class SaveTableChangesRequestParams : GeneralRequestDetails + { + public TableInfo TableInfo { get; set; } + + public TableDataModel Data { get; set; } + } + + public class SaveTableChangesResponse + { + } + + /// + /// The service request to save the changes. + /// + public class SaveTableChangesRequest + { + /// + /// Request definition + /// + public static readonly RequestType Type = RequestType.Create("tabledesigner/savechanges"); + } +} diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableChangeInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableChangeInfo.cs new file mode 100644 index 00000000..c8e13ef3 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableChangeInfo.cs @@ -0,0 +1,34 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System.Runtime.Serialization; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + [JsonConverter(typeof(StringEnumConverter))] + public enum DesignerEditType + { + [EnumMember(Value = "Add")] + Add, + [EnumMember(Value = "Remove")] + Remove, + [EnumMember(Value = "Update")] + Update, + } + + /// + /// The information about a change made inside the table designer. + /// + public class TableDesignerChangeInfo + { + public DesignerEditType Type { get; set; } + + public object Property { get; set; } + + public object Value { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableColumn.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableColumn.cs new file mode 100644 index 00000000..32101226 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableColumn.cs @@ -0,0 +1,25 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The data model of a table column object + /// + public class TableColumn + { + public InputBoxProperties Name { get; set; } + + public DropdownProperties Type { get; set; } + + public InputBoxProperties Length { get; set; } + + public CheckBoxProperties AllowNulls { get; set; } + + public InputBoxProperties DefaultValue { get; set; } + + public CheckBoxProperties IsPrimaryKey { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDataModel.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDataModel.cs new file mode 100644 index 00000000..a86d40cb --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDataModel.cs @@ -0,0 +1,27 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The data model for a table object + /// + public class TableDataModel + { + public InputBoxProperties Name { get; set; } + + public DropdownProperties Schema { get; set; } + + public InputBoxProperties Description { get; set; } + + public TableColumnCollection Columns { get; set; } + + public InputBoxProperties Script { get; set; } + } + + public class TableColumnCollection : TableProperties + { + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerInfo.cs new file mode 100644 index 00000000..a5bb108a --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerInfo.cs @@ -0,0 +1,21 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The information requested by the table designer UI. + /// + public class TableDesignerInfo + { + public TableDesignerView View { get; set; } + + public TableDataModel Data { get; set; } + + public string[] ColumnTypes { get; set; } + + public string[] Schemas { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerPropertyIdentifier.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerPropertyIdentifier.cs new file mode 100644 index 00000000..62c7a923 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerPropertyIdentifier.cs @@ -0,0 +1,19 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The information that can identify a property in a collection. + /// + public class TableDesignerPropertyIdentifier + { + public string ParentProperty { get; set; } + + public int Index { get; set; } + + public string Property { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerValidationError.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerValidationError.cs new file mode 100644 index 00000000..d57ffc1a --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerValidationError.cs @@ -0,0 +1,27 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using Microsoft.SqlTools.Hosting.Protocol.Contracts; +using Microsoft.SqlTools.ServiceLayer.Utility; +using Microsoft.SqlTools.Utility; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Validation error + /// + public class TableDesignerValidationError + { + /// + /// The error message + /// + public string Message { get; set; } + + /// + /// The property associated with the message, could be a string or TableDesignerPropertyIdentifier + /// + public object Property { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerView.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerView.cs new file mode 100644 index 00000000..44ae65ab --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableDesignerView.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// Table designer's view definition, there are predefined common properties. + /// Specify the additional properties in this class. + /// + public class TableDesignerView + { + public DesignerDataPropertyInfo[] AdditionalTableProperties { get; set; } + + public DesignerDataPropertyInfo[] AdditionalTableColumnProperties { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableInfo.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableInfo.cs new file mode 100644 index 00000000..8d319bf3 --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/Contracts/TableInfo.cs @@ -0,0 +1,25 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts +{ + /// + /// The information of the table being designed. + /// + public class TableInfo + { + public string Server { get; set; } + + public string Database { get; set; } + + public string Schema { get; set; } + + public string Name { get; set; } + + public bool IsNewTable { get; set; } + + public string ConnectionUri { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs new file mode 100644 index 00000000..efa07ebd --- /dev/null +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerService.cs @@ -0,0 +1,125 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +using System; +using System.Threading.Tasks; +using Microsoft.SqlTools.Hosting.Protocol; +using Microsoft.SqlTools.ServiceLayer.Hosting; +using Microsoft.SqlTools.ServiceLayer.TableDesigner.Contracts; + +namespace Microsoft.SqlTools.ServiceLayer.TableDesigner +{ + /// + /// Class that handles the Table Designer related requests + /// + public sealed class TableDesignerService : IDisposable + { + private bool disposed = false; + private static readonly Lazy instance = new Lazy(() => new TableDesignerService()); + + public TableDesignerService() + { + } + + /// + /// Gets the singleton instance object + /// + public static TableDesignerService Instance + { + get { return instance.Value; } + } + + /// + /// Service host object for sending/receiving requests/events. + /// + internal IProtocolEndpoint ServiceHost + { + get; + set; + } + + /// + /// Initializes the table designer service instance + /// + public void InitializeService(ServiceHost serviceHost) + { + this.ServiceHost = serviceHost; + this.ServiceHost.SetRequestHandler(GetTableDesignerInfoRequest.Type, HandleGetTableDesignerInfoRequest); + this.ServiceHost.SetRequestHandler(ProcessTableDesignerEditRequest.Type, HandleProcessTableDesignerEditRequest); + this.ServiceHost.SetRequestHandler(SaveTableChangesRequest.Type, HandleSaveTableChangesRequest); + } + + private async Task HandleGetTableDesignerInfoRequest(TableInfo tableInfo, RequestContext requestContext) + { + await Task.Run(async () => + { + try + { + // TODO + TableDataModel tableModel = new TableDataModel(); + TableDesignerView view = new TableDesignerView(); + await requestContext.SendResult(new TableDesignerInfo() + { + Data = tableModel, + View = view, + ColumnTypes = new string[] { }, + Schemas = new string[] { } + }); + } + catch (Exception e) + { + await requestContext.SendError(e); + } + }); + } + + private async Task HandleProcessTableDesignerEditRequest(ProcessTableDesignerEditRequestParams requestParams, RequestContext requestContext) + { + await Task.Run(async () => + { + try + { + // TODO + await requestContext.SendResult(new ProcessTableDesignerEditResponse() + { + Data = requestParams.Data, + IsValid = true + }); + } + catch (Exception e) + { + await requestContext.SendError(e); + } + }); + } + + private async Task HandleSaveTableChangesRequest(SaveTableChangesRequestParams requestParams, RequestContext requestContext) + { + await Task.Run(async () => + { + try + { + // TODO + await requestContext.SendResult(new SaveTableChangesResponse()); + } + catch (Exception e) + { + await requestContext.SendError(e); + } + }); + } + + /// + /// Disposes the table designer Service + /// + public void Dispose() + { + if (!disposed) + { + disposed = true; + } + } + } +}