Search code examples
c#asp.net-coreasp.net-core-3.1json-patch

Ignore JsonPatch specific property


I am currently trying to figure out how I could prevent the user of my API to change/update a specific property. From what I was able to gather from the web was that it is simply not supported, at least by the Microsoft implementation Microsoft.AspNetCore.JsonPatch. Other than that I was able to find the IObjectAdapter interface which would allow me to add some custom logic in the ApplyTo method. However that seems like a pretty ugly approach.

Obviously I could also use GraphQL, however that would be somewhat overkill for those few times I really need it. Would there be any alternative?


Solution

  • After some digging around on GitHub I was able to found a gem called JsonPath.Patchable by Labradoratory which exactly fixes the issue I am having. Although it does break the DDD pattern which doesn't really makes me to happy, but is pretty much the best we can get to.

    Update

    I just created a nuget package, which solves this problem, by providing extension methods which allow you to pass in specific properties which are allowed to be changed. Example:

    public class DummyModel
    {
        public int Id { get; set; }
        public string Value { get; set; }
    }
    
    var patchDocument = new JsonPatchDocument();
    patchDocument.Replace("/Value", "newValue");
    
    patchDocument.ApplyToWithRestrictions(dummy, "Value"); // Allows the Patch to only modify the Value property. This argument takes an array.
    

    The source code to this package is available here.