/// <summary> /// Parses the request URI and message body to create a new entry in the data store. /// </summary> /// <param name="messageBody">Stream containing the new entry to create.</param> /// <returns>Stream containing the new entry if successful, otherwise an error.</returns> public Stream ProcessCreateRequest(Stream messageBody) { object result; IEdmEntitySet targetEntitySet; try { var queryContext = this.GetDefaultQueryContext(); targetEntitySet = queryContext.ResolveEntitySet(); IncomingRequestMessage message = this.GetIncomingRequestMessage(messageBody); result = ProcessPostBody(message, targetEntitySet); } catch (Exception error) { return(this.WriteErrorResponse(400, error)); } return(this.WriteResponse( 200, (writer, writerSettings, responseMessage) => { ODataVersion targetVersion = writerSettings.Version.GetValueOrDefault(); responseMessage.SetHeader("Location", ODataObjectModelConverter.BuildEntryUri(result, targetEntitySet, targetVersion).OriginalString); ResponseWriter.WriteEntry(writer.CreateODataResourceWriter(targetEntitySet), result, targetEntitySet, this.Model, targetVersion, Enumerable.Empty <string>()); })); }
/// <summary> /// Parses a request to update a property and makes the corresponding change to the /// data store. /// </summary> /// <param name="messageBody">Message body containing the new property value.</param> /// <param name="propertyName">The name of the property to modify.</param> /// <returns>Stream containg the updated entry if successful, otherwise an error.</returns> public Stream ProcessTopLevelPropertyRequest(Stream messageBody, string propertyName) { object result; IEdmEntitySet targetEntitySet; try { // ODL Query fails to parse EntitySet(key)/Property so we remove the property name and parse the rest of the URI. var requestUriWithoutPropertyName = new Uri(this.IncomingRequestUri.OriginalString.Replace(propertyName, string.Empty)); QueryContext queryContext = QueryContext.ParseUri(requestUriWithoutPropertyName, this.Model); targetEntitySet = queryContext.ResolveEntitySet(); var keyValues = queryContext.ResolveKeyValues(); var message = this.GetIncomingRequestMessage(messageBody); using (var reader = new ODataMessageReader(message, this.GetDefaultReaderSettings(), this.Model)) { ODataProperty property = reader.ReadProperty(); this.DataContext.UpdateItem(targetEntitySet, keyValues, property.Name, property.Value); } result = this.DataContext.GetItem(targetEntitySet, keyValues); } catch (Exception error) { return(this.WriteErrorResponse(400, error)); } return(this.WriteResponse( 200, (writer, writerSettings, responseMessage) => { var targetVersion = writerSettings.Version.GetValueOrDefault(); responseMessage.SetHeader("Location", ODataObjectModelConverter.BuildEntryUri(result, targetEntitySet, targetVersion).OriginalString); ResponseWriter.WriteEntry(writer.CreateODataResourceWriter(targetEntitySet), result, targetEntitySet, this.Model, targetVersion, Enumerable.Empty <string>()); })); }