REST: Cannot update complex obs because complex data is null

This solved the problem:

1. Backend: I overloaded ObsResource1_11 in my module’s OMOD

@Resource(name = RestConstants.VERSION_1 + "/complexobs", order = 1, supportedClass = Obs.class, supportedOpenmrsVersions = {"1.11.*", "1.12.*"})
public class ComplexObsResource extends ObsResource1_11 {
   ...
  @Override
  public Obs save(Obs delegate) {
    if (isComplex(delegate) && null == delegate.getComplexData()) {
      delegate = Context.getObsService().getComplexObs(delegate.getId(), "view");
    }
    return super.save(delegate);
  }
   
  public static boolean isComplex(Obs obs) {
    return (null != obs && null != obs.getConcept() && obs.getConcept().isComplex());
  }
}

2. Frontend: I added a convenience Angular service: complexObsService.js

angular.module('complexObsService', ['ngResource', 'uicommons.common'])
  .factory('ComplexObs', function($resource) {
    return $resource("/" + OPENMRS_CONTEXT_PATH  + "/ws/rest/v1/complexobs/:uuid", {
      uuid: '@uuid'
    },{
      query: { method:'GET', isArray:false }
    });
  });

This was just copied from UI Commons’s obsService.js .

2 Likes