private Snapshot Deserialize(Models.Snapshot dto) { // Todo: Type cache? var snapshot = _snapshotSerializer.Deserialize(dto.Content, Type.GetType(dto.Type)); snapshot.AggregateId = dto.AggregateId; snapshot.Version = dto.Version; return(snapshot); }
public static async Task <HttpResponseData> RunAsync( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "sessions/{sessionIdString}/snapshots")] HttpRequestData req, string sessionIdString, CreateSnapshotDto data ) { // Create response var response = req.CreateResponse(); // Get user id var userId = Utils.GetUserId(req.Headers); // Validate params Guid sessionId; var valid = ValidateAndTryParse(userId, sessionIdString, out sessionId, data); if (valid.Item1) { try { // Start tasks var getPerceivedEmotionTask = CognitiveServices.GetPerceivedEmotionAsync(data.ImageBase64); var getSnapshotContainerTask = CosmosDb.GetContainerAsync(CosmosDb.SNAPSHOT_CONTAINER_ID); var getSessionContainerTask = CosmosDb.GetContainerAsync(CosmosDb.SESSION_CONTAINER_ID); // Wait all tasks to complete Task.WaitAll( getPerceivedEmotionTask, getSnapshotContainerTask, getSessionContainerTask ); // Get task results var perceivedEmotion = getPerceivedEmotionTask.Result; var snapshotContainer = getSnapshotContainerTask.Result; var sessionContainer = getSessionContainerTask.Result; // Check if not null if (perceivedEmotion != null) { // Get item var query = new QueryDefinition(@$ "SELECT * FROM c WHERE c.userId = @userId AND c.id = @sessionId") .WithParameter("@userId", userId) .WithParameter("@sessionId", sessionId); var session = await CosmosDb.GetItemByQueryAsync <Session>(sessionContainer, query); if (session != null) { // Update item session.LastUpdatedDateTime = DateTime.Now; // Create new instance var snapshot = new Models.Snapshot() { SessionId = sessionId, PerceivedEmotion = perceivedEmotion }; Task.WaitAll( // Save to database CosmosDb.CreateItemAsync <Snapshot>(snapshotContainer, snapshot, snapshot.SessionId.ToString()), CosmosDb.UpdateItemAsync <Session>(sessionContainer, session, session.Id.ToString(), session.UserId.ToString()), // Response save successful response.WriteAsJsonAsync(snapshot).AsTask() ); } else { // Response not found message await response.WriteAsJsonAsync("Session not found"); } } else { // Response no result message await response.WriteAsJsonAsync("No faces detected"); } } catch (CosmosException ex) { // Response error message await response.WriteAsJsonAsync(ex.Message); // Set http status code response.StatusCode = (HttpStatusCode)ex.Status; } } else { // Response invalid await response.WriteAsJsonAsync(valid.Item2); // Set http status code response.StatusCode = HttpStatusCode.BadRequest; } return(response); }