11import { AxiosRequestConfig } from 'axios' ;
22import { AidboxReference , AidboxResource , ValueSet , Bundle , BundleEntry , id } from 'shared/src/contrib/aidbox' ;
3+ import { cleanEmptyValues , removeNullsFromDicts } from 'utils/fhir' ;
34
45import { isFailure , RemoteDataResult , success , failure } from '../libs/remoteData' ;
56import { buildQueryParams } from './instance' ;
@@ -93,17 +94,28 @@ function getInactiveSearchParam(resourceType: string) {
9394
9495export async function createFHIRResource < R extends AidboxResource > (
9596 resource : R ,
96- searchParams ?: SearchParams
97+ searchParams ?: SearchParams ,
98+ dropNullsFromDicts = true
9799) : Promise < RemoteDataResult < WithId < R > > > {
98- return service ( create ( resource , searchParams ) ) ;
100+ return service ( create ( resource , searchParams , dropNullsFromDicts ) ) ;
99101}
100102
101- export function create < R extends AidboxResource > ( resource : R , searchParams ?: SearchParams ) : AxiosRequestConfig {
103+ export function create < R extends AidboxResource > (
104+ resource : R ,
105+ searchParams ?: SearchParams ,
106+ dropNullsFromDicts = true
107+ ) : AxiosRequestConfig {
108+ let cleanedResource = resource ;
109+ if ( dropNullsFromDicts ) {
110+ cleanedResource = removeNullsFromDicts ( cleanedResource ) ;
111+ }
112+ cleanedResource = cleanEmptyValues ( cleanedResource ) ;
113+
102114 return {
103115 method : 'POST' ,
104- url : `/${ resource . resourceType } ` ,
116+ url : `/${ cleanedResource . resourceType } ` ,
105117 params : searchParams ,
106- data : resource ,
118+ data : cleanedResource ,
107119 } ;
108120}
109121
@@ -114,23 +126,33 @@ export async function updateFHIRResource<R extends AidboxResource>(
114126 return service ( update ( resource , searchParams ) ) ;
115127}
116128
117- export function update < R extends AidboxResource > ( resource : R , searchParams ?: SearchParams ) : AxiosRequestConfig {
129+ export function update < R extends AidboxResource > (
130+ resource : R ,
131+ searchParams ?: SearchParams ,
132+ dropNullsFromDicts = true
133+ ) : AxiosRequestConfig {
134+ let cleanedResource = resource ;
135+ if ( dropNullsFromDicts ) {
136+ cleanedResource = removeNullsFromDicts ( cleanedResource ) ;
137+ }
138+ cleanedResource = cleanEmptyValues ( cleanedResource ) ;
139+
118140 if ( searchParams ) {
119141 return {
120142 method : 'PUT' ,
121- url : `/${ resource . resourceType } ` ,
122- data : resource ,
143+ url : `/${ cleanedResource . resourceType } ` ,
144+ data : cleanedResource ,
123145 params : searchParams ,
124146 } ;
125147 }
126148
127- if ( resource . id ) {
128- const versionId = resource . meta && resource . meta . versionId ;
149+ if ( cleanedResource . id ) {
150+ const versionId = cleanedResource . meta && cleanedResource . meta . versionId ;
129151
130152 return {
131153 method : 'PUT' ,
132- url : `/${ resource . resourceType } /${ resource . id } ` ,
133- data : resource ,
154+ url : `/${ cleanedResource . resourceType } /${ cleanedResource . id } ` ,
155+ data : cleanedResource ,
134156 ...( versionId ? { headers : { 'If-Match' : versionId } } : { } ) ,
135157 } ;
136158 }
@@ -236,39 +258,53 @@ export async function findFHIRResource<R extends AidboxResource>(
236258 }
237259}
238260
239- export async function saveFHIRResource < R extends AidboxResource > ( resource : R ) : Promise < RemoteDataResult < WithId < R > > > {
240- return service ( save ( resource ) ) ;
261+ export async function saveFHIRResource < R extends AidboxResource > (
262+ resource : R ,
263+ dropNullsFromDicts : boolean = true
264+ ) : Promise < RemoteDataResult < WithId < R > > > {
265+ return service ( save ( resource , dropNullsFromDicts ) ) ;
241266}
242267
243- export function save < R extends AidboxResource > ( resource : R ) : AxiosRequestConfig {
268+ export function save < R extends AidboxResource > ( resource : R , dropNullsFromDicts : boolean = true ) : AxiosRequestConfig {
244269 const versionId = resource . meta && resource . meta . versionId ;
270+ let cleanedResource = resource ;
271+ if ( dropNullsFromDicts ) {
272+ cleanedResource = removeNullsFromDicts ( cleanedResource ) ;
273+ }
274+ cleanedResource = cleanEmptyValues ( cleanedResource ) ;
245275
246276 return {
247277 method : resource . id ? 'PUT' : 'POST' ,
248- data : resource ,
278+ data : cleanedResource ,
249279 url : `/${ resource . resourceType } ${ resource . id ? '/' + resource . id : '' } ` ,
250280 ...( resource . id && versionId ? { headers : { 'If-Match' : versionId } } : { } ) ,
251281 } ;
252282}
253283
254284export async function saveFHIRResources < R extends AidboxResource > (
255285 resources : R [ ] ,
256- bundleType : 'transaction' | 'batch'
286+ bundleType : 'transaction' | 'batch' ,
287+ dropNullsFromDicts : boolean = true
257288) : Promise < RemoteDataResult < Bundle < WithId < R > > > > {
258289 return service ( {
259290 method : 'POST' ,
260291 url : '/' ,
261292 data : {
262293 type : bundleType ,
263294 entry : resources . map ( ( resource ) => {
264- const versionId = resource . meta && resource . meta . versionId ;
295+ let cleanedResource = resource ;
296+ if ( dropNullsFromDicts ) {
297+ cleanedResource = removeNullsFromDicts ( cleanedResource ) ;
298+ }
299+ cleanedResource = cleanEmptyValues ( cleanedResource ) ;
300+ const versionId = cleanedResource . meta && cleanedResource . meta . versionId ;
265301
266302 return {
267- resource ,
303+ cleanedResource ,
268304 request : {
269- method : resource . id ? 'PUT' : 'POST' ,
270- url : `/${ resource . resourceType } ${ resource . id ? '/' + resource . id : '' } ` ,
271- ...( resource . id && versionId ? { ifMatch : versionId } : { } ) ,
305+ method : cleanedResource . id ? 'PUT' : 'POST' ,
306+ url : `/${ cleanedResource . resourceType } ${ cleanedResource . id ? '/' + cleanedResource . id : '' } ` ,
307+ ...( cleanedResource . id && versionId ? { ifMatch : versionId } : { } ) ,
272308 } ,
273309 } ;
274310 } ) ,
@@ -395,7 +431,7 @@ export type ResourcesMap<T extends AidboxResource> = {
395431export function extractBundleResources < T extends AidboxResource > ( bundle : Bundle < T > ) : ResourcesMap < T > {
396432 const entriesByResourceType = { } as ResourcesMap < T > ;
397433 const entries = bundle . entry || [ ] ;
398- entries . forEach ( function ( entry ) {
434+ entries . forEach ( function ( entry ) {
399435 const type = entry . resource ! . resourceType ;
400436 if ( ! entriesByResourceType [ type ] ) {
401437 entriesByResourceType [ type ] = [ ] ;
0 commit comments