Laservall_solidworks_inject/Server/Handlers/SaveHandler.cs

69 lines
2.2 KiB
C#
Raw Permalink Normal View History

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<SaveRequest>(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<ChangeItem>();
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();
}
}
}