using Laservall.Solidworks.Server.Dto; using Newtonsoft.Json; using System.IO; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Laservall.Solidworks.Server.Handlers { internal sealed class SaveHandler { private readonly IBomDataProvider _dataProvider; public SaveHandler(IBomDataProvider dataProvider) { _dataProvider = dataProvider; } public async Task HandleSave(HttpListenerContext context, CancellationToken ct) { string body; using (var reader = new StreamReader(context.Request.InputStream, Encoding.UTF8)) { body = await reader.ReadToEndAsync(); } var request = JsonConvert.DeserializeObject(body); if (request?.Changes == null || request.Changes.Count == 0) { await WriteJson(context.Response, new SaveResponse { Success = true, SavedCount = 0 }, ct); return; } var changes = new System.Collections.Generic.List(); foreach (var c in request.Changes) { changes.Add(new ChangeItem { DocPath = c.DocPath, Key = c.Key, Value = c.Value }); } var result = _dataProvider.SaveChanges(changes); var response = new SaveResponse { Success = result.Success, SavedCount = result.SavedCount, Error = result.Error }; context.Response.StatusCode = result.Success ? 200 : 500; await WriteJson(context.Response, response, ct); } private static async Task WriteJson(HttpListenerResponse response, object data, CancellationToken ct) { response.ContentType = "application/json; charset=utf-8"; string json = JsonConvert.SerializeObject(data); byte[] bytes = Encoding.UTF8.GetBytes(json); response.ContentLength64 = bytes.Length; await response.OutputStream.WriteAsync(bytes, 0, bytes.Length, ct); response.Close(); } } }