diff --git a/src/AasxServerStandardBib/EventService.cs b/src/AasxServerStandardBib/EventService.cs index b53162bd..03d8d295 100644 --- a/src/AasxServerStandardBib/EventService.cs +++ b/src/AasxServerStandardBib/EventService.cs @@ -537,7 +537,7 @@ public async void PublishRestApiMessage(EventDto eventData, string submodelId, s wp = true; var e = CollectPayloadForRestApi(null, eventData.ConditionSM, eventData.ConditionSME, - minInterval, maxInterval, wp, diffTime); + minInterval, maxInterval, wp, diffTime, submodelId); var options = new JsonSerializerOptions { @@ -838,7 +838,7 @@ private string GetSha1Base64URL(string input) private List CollectPayloadForRestApi(SqlConditions? securitySqlConditions, AasCore.Aas3_1.Property conditionSM, AasCore.Aas3_1.Property conditionSME, TimeSpan minInterval, TimeSpan maxInterval, - bool withPayload, DateTime diffTime) + bool withPayload, DateTime diffTime, string eventSubmodelId) { bool isREST = true; @@ -892,7 +892,7 @@ private List CollectPayloadForRestApi(SqlConditions? securitySqlCo if (searchSM is "(*)" or "*" or "") { - var s = db.SMSets.Select(sm => sm.TimeStampTree); + var s = db.SMSets.Where(sm => sm.Identifier != eventSubmodelId).Select(sm => sm.TimeStampTree); if (s.Any()) { timeStampMax = s.Max(); @@ -900,7 +900,7 @@ private List CollectPayloadForRestApi(SqlConditions? securitySqlCo } else { - var s = db.SMSets.Where(searchSM).Select(sm => sm.TimeStampTree); + var s = db.SMSets.Where(sm => sm.Identifier != eventSubmodelId).Where(searchSM).Select(sm => sm.TimeStampTree); if (s.Any()) { timeStampMax = s.Max(); @@ -909,7 +909,7 @@ private List CollectPayloadForRestApi(SqlConditions? securitySqlCo eventPayload.SetTime(timeStampMax); - IQueryable smSearchSet = db.SMSets; + IQueryable smSearchSet = db.SMSets.Where(sm => sm.Identifier != eventSubmodelId); if (!searchSM.IsNullOrEmpty() && searchSM != "*") { smSearchSet = smSearchSet.Where(searchSM); @@ -944,7 +944,7 @@ private List CollectPayloadForRestApi(SqlConditions? securitySqlCo //entry.time = TimeStamp.TimeStamp.DateTimeToString(sm.TimeStampTree); - entry.dataSchema = EventPayload.REST_API_SM_SCHEMA_URL; + entry.SetDataschema(EventPayload.REST_API_SM_SCHEMA_URL); if (sm.SemanticId != null && !isREST) { @@ -1309,7 +1309,7 @@ public List CollectPayload(SqlConditions? securitySqlConditions, b entry.source = sourceString; - entry.dataSchema = EventPayload.SCHEMA_URL + CrudOperator.GetModelType(sme.SMEType); + entry.SetDataschema(EventPayload.SCHEMA_URL + CrudOperator.GetModelType(sme.SMEType)); if (notDeletedIdShortList != null && notDeletedIdShortList.Count > 0) { @@ -1367,7 +1367,7 @@ public List CollectPayload(SqlConditions? securitySqlConditions, b entry.SetSubmodelType(entryType); entry.SetTime(sm.TimeStampTree); - entry.dataSchema = EventPayload.SCHEMA_URL + "submodel"; + entry.SetDataschema(EventPayload.SCHEMA_URL + "submodel"); if (sm.SemanticId != null && !isREST) { @@ -1451,7 +1451,7 @@ private void AddStatus(string basicEventElementSourceString, string basicEventEl { if (!basicEventElementSourceString.IsNullOrEmpty()) { - eventPayload.dataSchema = "https://api.swaggerhub.com/domains/Plattform_i40/Part1-MetaModel-Schemas/V3.1.0#/components/schemas/BasicEventElement"; + eventPayload.SetDataschema("https://api.swaggerhub.com/domains/Plattform_i40/Part1-MetaModel-Schemas/V3.1.0#/components/schemas/BasicEventElement"); eventPayload.id = $"{basicEventElementSourceString}-{eventPayload.time}"; eventPayload.source = basicEventElementSourceString; eventPayload.cursor = "0"; @@ -2388,7 +2388,7 @@ public async void NotifyDeleted(ISubmodel submodel, string idShortPath, string s eventPayload.source = $"{Program.externalBlazor}/submodels/{Base64UrlEncoder.Encode(mqttEventDto.SubmodelId)}/events/{mqttEventDto.IdShortPath}.{mqttEventDto.IdShort}"; } eventPayload.semanticid = (mqttEventDto.SemanticId != null && mqttEventDto.SemanticId?.Keys != null) ? mqttEventDto.SemanticId?.Keys[0].Value : ""; - eventPayload.dataSchema = "https://api.swaggerhub.com/domains/Plattform_i40/Part1-MetaModel-Schemas/V3.1.0#/components/schemas/BasicEventElement"; + eventPayload.SetDataschema("https://api.swaggerhub.com/domains/Plattform_i40/Part1-MetaModel-Schemas/V3.1.0#/components/schemas/BasicEventElement"); } else @@ -2402,11 +2402,11 @@ public async void NotifyDeleted(ISubmodel submodel, string idShortPath, string s { sourceString += "/submodel-elements/" + idShortPath; eventPayload.semanticid = smeSemanticId; - eventPayload.dataSchema = EventPayload.SCHEMA_URL + smeModelType; + eventPayload.SetDataschema(EventPayload.SCHEMA_URL + smeModelType); } else { - eventPayload.dataSchema = EventPayload.SCHEMA_URL + "submodel"; + eventPayload.SetDataschema(EventPayload.SCHEMA_URL + "submodel"); if (submodel.SemanticId != null) { @@ -2547,7 +2547,7 @@ public async void NotifyDeleted(ISubmodel submodel, string idShortPath, string s eventPayload.SetSubmodelType(EventPayloadType.Deleted); eventPayload.SetTime(submodel.TimeStampTree); - eventPayload.dataSchema = EventPayload.REST_API_SM_SCHEMA_URL; + eventPayload.SetDataschema(EventPayload.REST_API_SM_SCHEMA_URL) ; if (submodel.SemanticId != null) { diff --git a/src/Contracts/Events/EventPayload.cs b/src/Contracts/Events/EventPayload.cs index f7eeadd6..8d674dd1 100644 --- a/src/Contracts/Events/EventPayload.cs +++ b/src/Contracts/Events/EventPayload.cs @@ -17,6 +17,7 @@ namespace Contracts.Events; using System.ComponentModel; using System.Text.Json.Nodes; using System.Text.Json.Serialization; +using Irony.Parsing; using Microsoft.IdentityModel.Tokens; @@ -65,7 +66,9 @@ public class EventPayload : IComparable public string type { get; set; } // Created, Updated, Deleted public string source { get; set; } // link to source public JsonObject data { get; set; } // JSON Serialization - public string dataSchema { get; set; } // SCHEMA_URL + model type + + public string dataSchema { get; private set; } // SCHEMA_URL + model type + public string dataschema { get; private set; } // SCHEMA_URL + model type fur REST API public List notDeletedIdShortList { get; set; } // for DELETE only, remaining idShort public string semanticid { get; set; } public string subject { get; set; } @@ -79,12 +82,14 @@ public EventPayload(bool isREST) { id = Guid.NewGuid().ToString(); domain = null; + dataSchema = null; } else { id = null; datacontenttype = DATA_CONTENT_TYPE; domain = ""; + dataschema = null; } IsREST = isREST; @@ -98,6 +103,18 @@ public void SetSubmodelType(EventPayloadType type) this.type = $"io.admin-shell.submodel.{type.ToString()?.ToLower()}.v1"; } + public void SetDataschema(string dataschema) + { + if (IsREST) + { + this.dataschema = dataschema; + } + else + { + this.dataSchema = dataschema; + } + } + public void SetTime(DateTime dateTime) { if (IsREST) @@ -165,6 +182,11 @@ public string GetIdShortPath() public string GetModelType() { + if (IsREST) + { + return dataschema.Split("/")?.Last(); + } + return dataSchema.Split("/")?.Last(); }