diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-11-16 18:32:04 +0200 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-11-16 18:32:04 +0200 |
| commit | 6f0f2a7908884deab8aca33ec967d03c5e564060 (patch) | |
| tree | b9d3e7efa91e8b3ac597dc1a824dd3a6175e16d4 /Software/Visual_Studio/Web | |
| parent | c39d31f1095bda6bda2755100f9f8df3da1eb93d (diff) | |
| download | Tango-6f0f2a7908884deab8aca33ec967d03c5e564060.tar.gz Tango-6f0f2a7908884deab8aca33ec967d03c5e564060.zip | |
Working on DataStore WebAPI.
Modified data store bytes parsing to Base64.
Diffstat (limited to 'Software/Visual_Studio/Web')
4 files changed, 82 insertions, 49 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/DataStoreController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/DataStoreController.cs index 3deab9205..f0dc0f2ba 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/DataStoreController.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/DataStoreController.cs @@ -7,7 +7,7 @@ using System.Web.Http; using Tango.BL.Entities; using Tango.DataStore; using Tango.DataStore.EF; -using Tango.MachineService.DataStore; +using Tango.DataStore.Web; using Tango.Web.Helpers; namespace Tango.MachineService.Controllers @@ -25,6 +25,8 @@ namespace Tango.MachineService.Controllers { try { + ValidateCollectionAndKey(collection, key); + using (var db = ObservablesContextHelper.CreateContext()) { if (sn != null) @@ -36,7 +38,7 @@ namespace Tango.MachineService.Controllers return ThrowException<List<DataStoreWebItem>>(new KeyNotFoundException(), HttpStatusCode.NotFound, "The specified machine serial number could not be found."); } - var localItems = db.DataStoreItems.Where(x => x.MachineGuid == machineGuid && (collection == null || x.CollectionName == collection) && (key == null || x.Key == key)).ToList(); + var localItems = db.DataStoreItems.Where(x => !x.IsDeleted).Where(x => x.MachineGuid == machineGuid && (collection == null || x.CollectionName == collection) && (key == null || x.Key == key)).ToList(); var globalItems = db.GlobalDataStoreItems.Where(x => (collection == null || x.CollectionName == collection) && (key == null || x.Key == key)).ToList(); List<DataStoreWebItem> finalList = new List<DataStoreWebItem>(); @@ -68,14 +70,64 @@ namespace Tango.MachineService.Controllers } } - public void Post([FromBody]string value) + public void Put([FromBody]DataStoreWebPutItem item) { + try + { + ValidateCollectionAndKey(item.Collection, item.Key); - } + using (var db = ObservablesContextHelper.CreateContext()) + { + if (item.MachineSerialNumber != null) + { + var machineGuid = db.Machines.Where(x => x.SerialNumber == item.MachineSerialNumber).Select(x => x.Guid).FirstOrDefault(); - public void Put(int id, [FromBody]string value) - { + if (machineGuid == null) + { + ThrowException<List<DataStoreWebItem>>(new KeyNotFoundException(), HttpStatusCode.NotFound, "The specified machine serial number could not be found."); + } + + DataStoreItem dbItem = db.DataStoreItems.FirstOrDefault(x => x.CollectionName == item.Collection && x.Key == item.Key); + + if (dbItem == null) + { + dbItem = new DataStoreItem(); + dbItem.Key = item.Key; + dbItem.CollectionName = item.Collection; + dbItem.MachineGuid = machineGuid; + db.DataStoreItems.Add(dbItem); + } + + dbItem.DataType = (int)item.DataType; + dbItem.IsDeleted = false; + dbItem.IsSynchronized = false; + dbItem.LastUpdated = DateTime.UtcNow; + dbItem.Value = EFDataStoreHelper.CreateBytes(item.DataType, DataStoreHelper.ParseDataStoreValue(item.DataType, item.Value.ToStringSafe(), item.ProtoMessageType)); + } + else + { + GlobalDataStoreItem dbItem = db.GlobalDataStoreItems.FirstOrDefault(x => x.CollectionName == item.Collection && x.Key == item.Key); + + if (dbItem == null) + { + dbItem = new GlobalDataStoreItem(); + dbItem.Key = item.Key; + dbItem.CollectionName = item.Collection; + db.GlobalDataStoreItems.Add(dbItem); + } + dbItem.DataType = (int)item.DataType; + dbItem.LastUpdated = DateTime.UtcNow; + dbItem.Value = EFDataStoreHelper.CreateBytes(item.DataType, DataStoreHelper.ParseDataStoreValue(item.DataType, item.Value.ToStringSafe(), item.ProtoMessageType)); + } + + db.SaveChanges(); + } + } + catch (Exception ex) + { + ThrowException<List<DataStoreWebItem>>(ex, HttpStatusCode.InternalServerError, ex.FlattenMessage()); + } } private T ThrowException<T>(Exception ex, HttpStatusCode code, String message = null) @@ -86,6 +138,26 @@ namespace Tango.MachineService.Controllers ReasonPhrase = ex.FlattenMessage() }); } + + private void ValidateCollectionAndKey(String collection = null, String key = null) + { + if (collection != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(collection)) + { + throw new ArgumentException("Collection name contains invalid characters."); + } + } + + if (key != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(key)) + { + throw new ArgumentException("Item key contains invalid characters."); + } + } + } + } #region Extension Methods @@ -145,6 +217,5 @@ namespace Tango.MachineService.Controllers return webItem; } } - #endregion } diff --git a/Software/Visual_Studio/Web/Tango.MachineService/DataStore/DataStoreWebItem.cs b/Software/Visual_Studio/Web/Tango.MachineService/DataStore/DataStoreWebItem.cs deleted file mode 100644 index ed8a8a385..000000000 --- a/Software/Visual_Studio/Web/Tango.MachineService/DataStore/DataStoreWebItem.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using Tango.DataStore; -using Tango.PMR.Common; - -namespace Tango.MachineService.DataStore -{ - public class DataStoreWebItem - { - public String Collection { get; set; } - [JsonConverter(typeof(StringEnumConverter))] - public DataStoreWebItemType Type { get; set; } - public DateTime Date { get; set; } - public String Key { get; set; } - [JsonConverter(typeof(StringEnumConverter))] - public DataType DataType { get; set; } - [JsonConverter(typeof(StringEnumConverter))] - public MessageType ProtoMessageType { get; set; } - public Object LocalValue { get; set; } - public Object GlobalValue { get; set; } - } -}
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/DataStore/DataStoreWebItemType.cs b/Software/Visual_Studio/Web/Tango.MachineService/DataStore/DataStoreWebItemType.cs deleted file mode 100644 index 0ba8e1a5e..000000000 --- a/Software/Visual_Studio/Web/Tango.MachineService/DataStore/DataStoreWebItemType.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; - -namespace Tango.MachineService.DataStore -{ - public enum DataStoreWebItemType - { - Local, - Global, - Overrides - } -}
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj b/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj index bc60327ba..df4e346f6 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj +++ b/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj @@ -322,8 +322,6 @@ <Compile Include="Controllers\DownloadsController.cs" /> <Compile Include="Controllers\AccountController.cs" /> <Compile Include="Controllers\FSEController.cs" /> - <Compile Include="DataStore\DataStoreWebItem.cs" /> - <Compile Include="DataStore\DataStoreWebItemType.cs" /> <Compile Include="Filters\JwtTokenFilter.cs" /> <Compile Include="Hubs\ExternalBridgeHub.cs" /> <Compile Include="MachineServiceConfig.cs" /> @@ -409,6 +407,10 @@ <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> <Name>Tango.DataStore.EF</Name> </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.Web\Tango.DataStore.Web.csproj"> + <Project>{a9828548-af43-4ce4-8b13-50e99f9c9cf7}</Project> + <Name>Tango.DataStore.Web</Name> + </ProjectReference> <ProjectReference Include="..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> <Name>Tango.DataStore</Name> |
