public RecordedEvent(EventEntryDTO entry, string baseUrl) { Link = new RecordedEventLink() { Href = $"{baseUrl}{entry.Id.RawValue}" }; Id = entry.Id; ReceptionTime = entry.ReceptionTime; UUID = entry.UUID; Client = new EventEntryClient(entry.Client_UUID, entry.Client_Name); Time = entry.EventTime; Action = entry.Action; Description = entry.Description; URL = entry.URL; Actor = new EventEntryActor(entry.Actor_UUID, entry.Actor_Name, entry.Actor_Email); Context = new EventEntryContext(entry.Context_Client_IP, entry.Context_Client_BrowserAgent, entry.Context_Server_ServerId, entry.Context_Server_Version); if (entry.TargetUser_Id != null) { Target = new EventEntryTarget("User", entry.TargetUser_UUID, entry.TargetUser_Name, null); } else { Target = new EventEntryTarget(entry.Target_Type, entry.Target_UUID, entry.Target_Label, entry.Target_URL); } }
public async Task <IActionResult> SubmitEventAsync([FromBody] EventEntry[] entries) { if (!ModelState.IsValid) { return(BadRequest(new ApiError(400, ModelState))); } foreach (var entry in entries) { EnsureAllowedNullsAreRepresented(entry); } var customerId = _membership.GetCustomerId(User); var results = new EventAcceptedResponse(); foreach (var entry in entries) { var dto = new EventEntryDTO(null, customerId, DateTime.UtcNow, entry.UUID, null, entry.Client.UUID, entry.Client.Name, entry.Time.Value, // nullable - ModelBinding should catch this, as it's annotated as Required - convert to UTC entry.Action, entry.Description, entry.URL, null, entry.Actor.UUID, entry.Actor.Name, entry.Actor.Email, entry.Context.Client.IPAddress, entry.Context.Client.BrowserAgent, entry.Context.Server.ServerId, entry.Context.Server.Version, entry.Target.Type, entry.Target.UUID, entry.Target.Label, entry.Target.URL, null, entry.TargetUser.UUID, entry.TargetUser.Name, entry.TargetUser.Email); EventEntryId id = await _persistence.EventEntries.CreateAsync(dto); results.ReceivedEvents.Add(new ReceivedEventEntryId(id, entry.UUID)); } return(Ok(results)); }
public async Task <EventEntryId> CreateAsync(EventEntryDTO eventEntry) { var sqlParams = new { CustomerId = eventEntry.CustomerId.RawValue, eventEntry.ReceptionTime, eventEntry.UUID, eventEntry.Client_UUID, eventEntry.Client_Name, eventEntry.EventTime, eventEntry.Action, eventEntry.Description, eventEntry.URL, eventEntry.Actor_UUID, eventEntry.Actor_Name, eventEntry.Actor_Email, eventEntry.Context_Client_IP, eventEntry.Context_Client_BrowserAgent, eventEntry.Context_Server_ServerId, eventEntry.Context_Server_Version, eventEntry.Target_Type, eventEntry.Target_UUID, eventEntry.Target_Label, eventEntry.Target_URL, eventEntry.TargetUser_UUID, eventEntry.TargetUser_Name, eventEntry.TargetUser_Email }; // double @ is for variables delcared in the statement so PteaPoco won't try to provide them string sql = @"; -- Ensure Actor is in DB and up to date DECLARE @@ActorId uniqueidentifier; SELECT @@ActorId = Id FROM dbo.EventActors WHERE CustomerId = @CustomerId AND UUID = @Actor_UUID; IF @@ActorId IS NULL BEGIN SET @@ActorId = NewID(); INSERT INTO dbo.EventActors(Id, CustomerId, UUID, Name, Email, IsForgotten) VALUES(@@ActorId, @CustomerId, @Actor_UUID, @Actor_Name, @Actor_Email, 0); END ELSE BEGIN UPDATE dbo.EventActors SET Name = @Actor_Name, Email = @Actor_Email WHERE Id = @@ActorId AND IsForgotten = 0 AND Name <> @Actor_Name AND Email <> @Actor_Email; END -- Ensure Target Actor is in DB and up to date (If Set) DECLARE @@TargetActorId uniqueidentifier; IF @TargetUser_UUID IS NOT NULL BEGIN SELECT @@TargetActorId = Id FROM dbo.EventActors WHERE CustomerId = @CustomerId AND UUID = @TargetUser_UUID; IF @@TargetActorId IS NULL BEGIN SET @@TargetActorId = NewID(); INSERT INTO dbo.EventActors(Id, CustomerId, UUID, Name, Email, IsForgotten) VALUES(@@TargetActorId, @CustomerId, @TargetUser_UUID, @TargetUser_Name, @TargetUser_Email, 0); END ELSE BEGIN UPDATE dbo.EventActors SET Name = @TargetUser_Name, Email = @TargetUser_Email WHERE Id = @@TargetActorId AND IsForgotten = 0 AND Name <> @TargetUser_Name AND Email <> @TargetUser_Email; END END -- Ensure Client is in DB and up to date DECLARE @@ClientId uniqueidentifier; SELECT @@ClientId = Id FROM dbo.EventClients WHERE CustomerId = @CustomerId AND UUID = @Client_UUID; IF @@ClientId IS NULL BEGIN SET @@ClientId = NewID(); INSERT INTO dbo.EventClients(Id, CustomerId, UUID, Name) VALUES(@@ClientId, @CustomerId, @Client_UUID, @Client_Name); END ELSE BEGIN UPDATE dbo.EventClients SET Name = @Client_Name WHERE Id = @@ClientId; END DECLARE @@Id uniqueidentifier = NewId(); INSERT INTO dbo.EventEntries(Id, CustomerId, ReceptionTime, UUID, EventClientId, EventTime, Action, Description, URL, EventActorId, Context_Client_IP, Context_Client_BrowserAgent, Context_Server_ServerId, Context_Server_Version, Target_Type, Target_UUID, Target_Label, Target_URL, TargetEventActorId) VALUES( @@Id,@CustomerId,@ReceptionTime,@UUID, @@ClientId,@EventTime,@Action,@Description,@URL, @@ActorId,@Context_Client_IP,@Context_Client_BrowserAgent,@Context_Server_ServerId,@Context_Server_Version,@Target_Type,@Target_UUID,@Target_Label,@Target_URL, @@TargetActorId); SELECT @@Id as Id; "; var rawId = await _db.QuerySingle(async (db) => { return(await db.FetchAsync <Guid>(sql, sqlParams)); }); return(new EventEntryId(rawId)); }